2012-05-08 39 views
0

我有一個c#aspx web應用程序,它可以在運行中生成大部分組件。有這個GridView是爲了顯示一些複選框。gridview上的動態複選框

奇怪的是,它沒有顯示運行的組件,而是命名空間,即System.UI.Webcontrols.CheckBox

我需要看到複選框;這怎麼解決?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound" /> 
    </div> 
    </form> 
</body> 
</html> 

[aspx.cs] 

namespace ChkBoxOnGridView 
{ 
    public partial class WebForm1 : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      PopulateGridView(); 
     } 
     protected void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e) 
     { 
      if (e.Row.RowType == DataControlRowType.DataRow) 
      { 
       CheckBox cb = new CheckBox(); 
       e.Row.Cells[1].Controls.Add(cb); 
      } 
     } 

     private void PopulateGridView() 
     { 
      GridView1.DataSource = null; 
      GridView1.Columns.Clear(); 

      DataTable dt = new DataTable(); 

      dt.Columns.Add(new DataColumn("DTA", typeof(System.String))); 
      dt.Columns.Add(new DataColumn("Is Visible", typeof(System.Web.UI.WebControls.CheckBox))); 

      CheckBox chkbx = new CheckBox(); 
      chkbx.Checked = true; 

      DataRow row1 = dt.NewRow(); 
      row1["DTA"] = "Some Text"; 
      row1["Is Visible"] = chkbx; 
      dt.Rows.Add(row1); 

      foreach (DataColumn col in dt.Columns) 
      { 
       BoundField bField = new BoundField(); 
       bField.DataField = col.ColumnName; 
       bField.HeaderText = col.ColumnName; 
       GridView1.Columns.Add(bField); 
      } 

      GridView1.DataSource = dt; 
      GridView1.DataBind(); 
     } 
    } 
} 

回答

2

您需要使用GridView.RowdataBound event每一行中單獨創建的每個對象。

您可以使用e.Row.Cells[]

添加它可是,得到確信你在正確的地方創建它,你必須在這種情況下,你是在一排,以檢查是不是頭或頁腳或尋呼機。您可以通過檢查e.Row的GridViewRow.RowType Property做到這一點,並檢查它是否是DataRow

void CustomersGridView_RowDataBound(Object sender, GridViewRowEventArgs e) 
{ 

    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
    CheckBox cb = new CheckBox(); 
    // cb.id = ... and other control setup 
    // add your control here: 
    e.Row.Cells[0].Controls.Add(cb); 
    } 
} 
+0

請你給我看一個基於我的代碼的工作模型,對於c#來說是相當新的。 – antowizzy

+0

我向你展示的內容沒有任何困難。然而,我將明確指出,您只需要DataBind CustomerGridView,並使用如圖所示的代碼處理RowDataBound事件。您可以訪問與每個行相關的數據,將e.Row.DataItem轉換爲您的模型類,以便您可以輕鬆訪問其屬性以決定如何添加控件。 – JotaBe

+0

如何讓cb使用chkbx的檢查狀態並刪除第一列的重複的第三列?我已經更新了代碼。 – antowizzy

1

走出去的肢體,我會說,你不能持有一個DataTable控制。 [Is Visible]應該是一個布爾值

我會在On Init事件中使用模板列添加列。看到這個問題: Adding dynamic columns to an ASP.NET Gridview