如何在GridView中将控件绑定到<ItemTemplate>?

问题描述

| 编辑:我的对象定义如下。我将其传递给GridView1。
public class UserTestorviewmodel
{
    public string Username {get;set;}
    public string Password {get;set;}
    public Label SuiteName {get;set;}
}
我将GridView绑定到自定义
List<UserTestorviewmodel>
this.GridView1.DataSource = utviewmodelList;
this.GridView1.DataBind();
在.aspx中,我有
<asp:TemplateField HeaderText=\"LoginName\">
<ItemTemplate>
<asp:Label ID=\"LoginName\" runat= \"server\" Text= \'<%# ((viewmodels.UserTestorviewmodel)Container.DataItem).User.userName %> \'></asp:Label>
</ItemTemplate>
</asp:TemplateField> 
这是有效的,因为
viewmodels.UserTestorviewmodel.User.userName
是字符串,但是
<asp:TemplateField HeaderText=\"SuiteName\">
<ItemTemplate>
<%# ((viewmodels.UserTestorviewmodel)Container.DataItem).SuiteName %>
</ItemTemplate>
</asp:TemplateField>
因为
viewmodels.UserTestorviewmodel.SuiteName
是from7ѭ的标签 那么如何将
System.Web.UI.WebControls
绑定到
<ItemTemplate>
而不是
System.Web.UI.WebControls
的文本     

解决方法

您可以在ItemTemplate中放置一个Placeholder控件,并将其标签控件放在GridView的RowCreated事件上:
    protected void Page_Init(object sender,EventArgs e)
    {
        GridView1.RowCreated += new GridViewRowEventHandler(GridView1_RowCreated);
    }

    void GridView1_RowCreated(object sender,GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            var dataItem = (KeyValuePair<int,Label>)e.Row.DataItem;
            var nameLabelPlaceholder = e.Row.FindControl(\"NameLabelPlaceholder\") as PlaceHolder;
            if (nameLabelPlaceholder != null)
            {
                nameLabelPlaceholder.Controls.Add(dataItem.Value);
            }
        }
    }

    protected void Page_Load(object sender,EventArgs e)
    {
        if (!IsPostBack)
        {
            GridView1.DataSource = GetGridViewDataSource();
            GridView1.DataBind();
        }
    }

    private object GetGridViewDataSource()
    {
        return (from item in Enumerable.Range(1,10)
                select new KeyValuePair<int,Label>(item,new Label() { ID = string.Format(\"NameLabel_{0}\",item),Text = string.Format(\"Item #{0}\",ForeColor = System.Drawing.Color.Red }))
                    .ToDictionary(kvp1 => kvp1.Key,kvp2 => kvp2.Value);
    }


    <asp:GridView ID=\"GridView1\" runat=\"server\" AutoGenerateColumns=\"false\" DataKeyNames=\"Key\">
        <Columns>
            <asp:BoundField HeaderText=\"Id\" DataField=\"Key\" />
            <asp:TemplateField HeaderText=\"Name\">
                <ItemTemplate>
                    <asp:PlaceHolder runat=\"server\" ID=\"NameLabelPlaceholder\" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>