我有一个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>
但是,我现在遇到的问题是,角色列没有引用它应该的列,即“模块领导者”
答案 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" : "";
}
在数据绑定时会发生这种情况,每行只会发生一次。