2011-05-26 91 views
0

编辑:我的对象定义如下。我将它传递给GridView1。如何在GridView中将控件绑定到<ItemTemplate>?

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.SuiteNameSystem.Web.UI.WebControls

标签那么如何绑定一个System.Web.UI.WebControls<ItemTemplate>不是在的System.Web.UI.WebControls

回答

2

文本您可以将在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> 
+0

这几乎是我想要的。但是当'this.GridView1.DataSource = utViewModelList;'时,我已经将'Label'传递给了GridView1。当你提供'GridView1_RowCreated'时如何获取它。谢谢。 – hbrls 2011-05-26 07:36:18

+0

我写了'var dataItem = e.Row.DataItem;'。在调试模式下,我看到dataItem是我传入GridView的内容以及我正在寻找的内容。但为什么我不能使用'dataItem.SuiteName'? – hbrls 2011-05-26 07:46:26

+0

当然,您可以但e.Row.DataItem的类型是System.Object,您必须将其转换为您的类型(ViewModels.UserTestorViewModel) – 2011-05-26 08:01:58