Как привязать элемент управления к <ItemTemplate>в GridView? - PullRequest
0 голосов
/ 26 мая 2011

Редактировать: Мой объект определен, как показано ниже.Я передал его в 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 это Метка от System.Web.UI.WebControls

Так как связать System.Web.UI.WebControls с <ItemTemplate> НЕТекст System.Web.UI.WebControls

1 Ответ

2 голосов
/ 26 мая 2011

Вы можете поместить элемент управления Placeholder в ItemTemplate и поместить свой элемент управления меткой в ​​него в событии RowCreated GridView:

    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}", item), 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...