Gridview - 引用新列

时间:2009-09-16 01:24:37

标签: c# asp.net gridview

我有一个gridview,它从3个表中获取数据。 此gridview还有一个名为“Role”的附加列,该列未包含在数据库中。 目前,没有添加任何逻辑,只是使用findcontrol到标签,“角色”,我可以显示“ML” 但是,当我添加逻辑时,它根本没有出现。

在任何情况下,是否有人知道如何将“ML”插入“角色”列中,该列在数据库中找不到,但是是从数据库中找到的另一列引用。

这是用于在角色列中显示“ML”的代码。

protected void gridAMDisplay_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        //find the Label control using FindControl and set its Text on some column value
        DataRowView row = (DataRowView)e.Row.DataItem;

        if (!DBNull.Value.Equals(row["ModuleLeader"]))
        {

            if (row["ModuleLeader"].ToString() == "ModuleStr")
            {
                Label lbl = e.Row.FindControl("lblRole") as Label;
                if (lbl != null)
                {
                    lbl.Text = "ML";
                }
            }
        }
    }
}

这部分代码在注释时关闭,ML可以显示在角色列中,否则,不显示任何内容。 因此,我觉得findcontrol部分工作。但是,引用不起作用。

if (row["ModuleLeader"].ToString() == "ModuleStr")
            {

正如我所提到的,角色列未包含在数据库的任何表中。 因此,我在此代码中添加了。

<asp:TemplateField HeaderText="Role">
    <ItemTemplate>
        <asp:Label ID="lblRole" runat="server" Text="" />
    </ItemTemplate>
</asp:TemplateField>

但是,我现在遇到的问题是,角色列没有引用它应该的列,即“模块领导者”

3 个答案:

答案 0 :(得分:0)

您引用DataBound,它不能在DataBound中使用,您应该使用OnDataBinding来实现它。

答案 1 :(得分:0)

我拙见的最佳做法是创建自己的模板。

以下是您的案例:

public class NotEmptyValueFromDataTemplate : System.Web.UI.Page, IBindableTemplate
{
    protected string p_DataFieldToLookAt;
    protected string p_ValueToPlaceInIfNotNull;
    protected Literal p_litControl;

    public RoleTemplate(string DataFieldToLookAt, string ValueToPlaceInIfNotNull)
    {
        this.p_DataFieldToLookAt = DataFieldToLookAt;
        this.p_ValueToPlaceInIfNotNull = ValueToPlaceInIfNotNull;
    }

    public virtual void OnInit(object sender, EventArgs e)
    { }

    #region IBindableTemplate Members

    public System.Collections.Specialized.IOrderedDictionary ExtractValues(Control container)
    {
        throw new NotImplementedException();
    }

    #endregion

    #region ITemplate Members

    public void InstantiateIn(Control container)
    {
        p_litControl = new Literal();
        p_litControl.ID = p_DataFieldToLookAt; /* we don't really care */
        p_litControl.Init += new EventHandler(OnInit);
        p_litControl.DataBinding += new EventHandler(p_litControl_DataBinding);
        container.Controls.Add(p_litControl);
    }

    void p_litControl_DataBinding(object sender, EventArgs e)
    {
        var Data = ((GridViewRow)(p_litControl.NamingContainer)).DataItem;

        string ValueFromData = Convert.ToString(DataBinder.Eval(Data, p_DataFieldToLookAt));

        if(!String.IsNullOrEmpty(ValueFromData))
            p_litControl.Text = p_ValueToPlaceInIfNotNull;
    }

    protected override void OnDataBinding(EventArgs e)
    {
        base.OnDataBinding(e);
    }

    #endregion
}

然后,您必须实例化每个模板行:

protected void GridView3_Init(object sender, EventArgs e)
{
    ((TemplateField)(GridView3.Columns[/* Column Index Here*/])).ItemTemplate = new     NotEmptyValueFromDataTemplate("ModuleLeader", "ML");
}

最后,在gridview中创建模板项:

<asp:TemplateField HeaderText="Role"></asp:TemplateField>

PS:代码未经测试且已从解决方案中删除

答案 2 :(得分:0)

您似乎只希望角色列根据同一行中另一列中的数据更新为“ML”。为什么不把它放在XHTML中呢?

<asp:TemplateField HeaderText="Role"> 
    <ItemTemplate> 
        <asp:Label ID="lblRole" runat="server" Text='<%# GetRoleString(Eval("ModuleLeader"))%>' /> 
    </ItemTemplate> 
</asp:TemplateField> 

然后在后面的代码中你可以有一个方法:

string GetRoleString(string moduleLeader) 
{
     return (moduleLeader == "ModuleStr") ? "ML" : "";
}

在数据绑定时会发生这种情况,每行只会发生一次。