2011-05-26 58 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