2012-05-08 20 views
0

私は、そのコンポーネントの大部分をオンザフライで生成するためのC#aspx Webアプリケーションを用意しています。いくつかのチェックボックスを表示するための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をチェックすることにより、これを行うと、それは私はあなたがDataTableの制御を保持することはできませんと言うでしょう手足に出て行く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

私のコードに基づいて実用的なモデルを表示してください、私は非常に新しいです#。 – antowizzy

+0

私があなたに見せていることは何も難しいことではありません。ただし、CustomerGridViewをDataBindし、RowDataBoundイベントを次のようなコードで処理するだけで済むことを明確にします。 e.Row.DataItemを各モデルクラスにキャストした各行に関連付けられたデータにアクセスすることができます。これにより、そのプロパティに簡単にアクセスしてコントロールの追加方法を簡単に決定できます。 – JotaBe

+0

どのようにして、チェックされたchkbxのステータスを取得し、最初の列の繰り返しである3番目の列を削除するためにcbを作成しますか?私はコードを更新しました。 – antowizzy

1

だかどうかを確認します。 [表示される]はブール値でなければなりません

テンプレート列を使用してOn Initイベントに列を追加します。この質問を参照してください: Adding dynamic columns to an ASP.NET Gridview