0

ほとんどのコンポーネントをその場で生成することを目的としたc#aspxWebアプリケーションがあります。いくつかのチェックボックスを表示することを目的としたこの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();
        }
    }
}
4

2 に答える 2

2

GridView.RowdataBound イベントを使用して、各オブジェクトを各行に個別に作成する必要があります。

を使用して追加できますe.Row.Cells[]

ただし、適切な場所に作成していることを確認するには、このイベントで、ヘッダー、フッター、またはページャーではない行にいることを確認する必要があります。これを行うには、e.Row のGridViewRow.RowType プロパティをチェックし、それが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);
  }
}
于 2012-05-08T22:23:36.547 に答える
1

手足に出かけると、DataTable にコントロールを保持することはできないと言えます。[Is Visible] はブール値である必要があります

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

于 2012-05-08T22:38:16.143 に答える