2009-09-16 51 views
0

我有一個從3個表中獲取數據的gridview。 而且這個gridview還有一個名爲「Role」的附加列,它不包含在數據庫中。 目前,沒有添加任何邏輯,只是簡單地使用標籤「角色」的findcontrol,我可以顯示出「ML」 但是,當我添加邏輯時,它根本沒有出現。Gridview - 引用一個新列

在任何情況下,是否有人知道如何將「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> 

不過,我現在已經是問題,角色列不提及它應該列,這是「模塊領導者」

+0

我編輯了您的問題,以正確格式化代碼示例,以便人們可以看到它們。 – 2009-09-16 01:34:50

回答

0

你引用的DataItem,哪些不能在DataBound中使用,你應該使用OnDataBinding來實現這一點。

+0

如何使用onDataBinding?你能給我一個例子嗎? – Nana 2009-09-16 12:22:43

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:代碼未經測試並寫出解決方案

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" : ""; 
} 

這將發生在數據綁定,只會每行發生一次。