none
CheckBoxField 有効化 RRS feed

  • 質問

  • お世話になっております。
    GridViewのCheckBoxField を定義し、ユーザーがクリックで
    チェックボックスを切り替えられるようにしたいのですが、
    CheckBoxField.ReadOnly = false;でも灰色のままになります。
    有効にするにはどうすればよろしいでしょうか。

    環境:VS2008 C#

      protected void Page_Load( object sender, EventArgs e )
      {
       GridViewMain.AutoGenerateColumns = false;
       GridViewMain.Columns.Clear();
    
       // グリッドカラム定義
       BoundField column = new BoundField();
       column.DataField = "Id";
       column.HeaderText = column.DataField;
       column.ReadOnly = true;
       GridViewMain.Columns.Add( column );
    
       CheckBoxField checkBox = new CheckBoxField();
       checkBox.DataField = "Available";
       checkBox.HeaderText = checkBox.DataField;
       checkBox.ReadOnly = false;
       GridViewMain.Columns.Add( checkBox );
    
       // ダミーデータ
       DataTable table = new DataTable();
       table.Columns.Add( new DataColumn( "Id", typeof( string ) ) );
       table.Columns.Add( new DataColumn( "Available", typeof( bool ) ) );
       for( int i = 0; i < 10; i++ )
       {
        DataRow row = table.NewRow();
        row[ "Id" ] = i.ToString();
        row[ "Available" ] = false;
        table.Rows.Add( row );
       }
       // バインド処理
       GridViewMain.DataSource = table;
       GridViewMain.DataBind();
      }
    
    2009年12月2日 19:21

回答

  • 編集モードにする必要があります。例えば、3行目を編集状態にするには以下のようにします。

    GridViewMain.EditIndex = 2;


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク Myon 2009年12月6日 4:29
    2009年12月3日 1:22
    モデレータ
  • > GridViewのCheckBoxField を定義し、ユーザーがクリックで
    > チェックボックスを切り替えられるようにしたいのですが、
    > CheckBoxField.ReadOnly = false;でも灰色のままになります。
    > 有効にするにはどうすればよろしいでしょうか。

    CheckBox を ItemTemplate に入れれば可能です。動的に ItemTemplate を作るのは少々面倒です
    が、以下のようにすれば可能です。

    protected void Page_Load(object sender, EventArgs e)
    {
        GridViewMain.AutoGenerateColumns = false;
        GridViewMain.Columns.Clear();

        // グリッドカラム定義
        BoundField column = new BoundField();
        column.DataField = "Id";
        column.HeaderText = column.DataField;
        column.ReadOnly = true;
        GridViewMain.Columns.Add(column);

        TemplateField tf = new TemplateField();
        tf.HeaderText = "Available";
        tf.ItemTemplate = new MyItemTemplate();
        GridViewMain.Columns.Add(tf);

        // ダミーデータ
        DataTable table = new DataTable();
        table.Columns.Add(new DataColumn("Id", typeof(string)));
        table.Columns.Add(new DataColumn("Available", typeof(bool)));
        for (int i = 0; i < 10; i++)
        {
            DataRow row = table.NewRow();
            row["Id"] = i.ToString();
            row["Available"] = false;
            table.Rows.Add(row);
        }
        // バインド処理
        GridViewMain.DataSource = table;
        GridViewMain.DataBind();
    }

    public class MyItemTemplate : ITemplate
    {
        public void InstantiateIn(Control container)
        {
            CheckBox cb = new CheckBox();
            cb.DataBinding += new EventHandler(this.DataBinding);
            container.Controls.Add(cb);
        }

        public void DataBinding(object sender, EventArgs e)
        {
            CheckBox cb = (CheckBox)sender;
            DataRowView dataItem = (DataRowView)((GridViewRow)cb.NamingContainer).DataItem;
            cb.Checked = (bool)((DataRowView)dataItem)["Available"];
        }
    }

    • 回答としてマーク Myon 2009年12月6日 4:29
    2009年12月3日 14:35

すべての返信

  • 編集モードにする必要があります。例えば、3行目を編集状態にするには以下のようにします。

    GridViewMain.EditIndex = 2;


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク Myon 2009年12月6日 4:29
    2009年12月3日 1:22
    モデレータ
  • > GridViewのCheckBoxField を定義し、ユーザーがクリックで
    > チェックボックスを切り替えられるようにしたいのですが、
    > CheckBoxField.ReadOnly = false;でも灰色のままになります。
    > 有効にするにはどうすればよろしいでしょうか。

    CheckBox を ItemTemplate に入れれば可能です。動的に ItemTemplate を作るのは少々面倒です
    が、以下のようにすれば可能です。

    protected void Page_Load(object sender, EventArgs e)
    {
        GridViewMain.AutoGenerateColumns = false;
        GridViewMain.Columns.Clear();

        // グリッドカラム定義
        BoundField column = new BoundField();
        column.DataField = "Id";
        column.HeaderText = column.DataField;
        column.ReadOnly = true;
        GridViewMain.Columns.Add(column);

        TemplateField tf = new TemplateField();
        tf.HeaderText = "Available";
        tf.ItemTemplate = new MyItemTemplate();
        GridViewMain.Columns.Add(tf);

        // ダミーデータ
        DataTable table = new DataTable();
        table.Columns.Add(new DataColumn("Id", typeof(string)));
        table.Columns.Add(new DataColumn("Available", typeof(bool)));
        for (int i = 0; i < 10; i++)
        {
            DataRow row = table.NewRow();
            row["Id"] = i.ToString();
            row["Available"] = false;
            table.Rows.Add(row);
        }
        // バインド処理
        GridViewMain.DataSource = table;
        GridViewMain.DataBind();
    }

    public class MyItemTemplate : ITemplate
    {
        public void InstantiateIn(Control container)
        {
            CheckBox cb = new CheckBox();
            cb.DataBinding += new EventHandler(this.DataBinding);
            container.Controls.Add(cb);
        }

        public void DataBinding(object sender, EventArgs e)
        {
            CheckBox cb = (CheckBox)sender;
            DataRowView dataItem = (DataRowView)((GridViewRow)cb.NamingContainer).DataItem;
            cb.Checked = (bool)((DataRowView)dataItem)["Available"];
        }
    }

    • 回答としてマーク Myon 2009年12月6日 4:29
    2009年12月3日 14:35
  • ご回答ありがとうございました。
    テンプレートを使う方法で解決しました。
    ありがとうございました。
    また、返信が遅れまして申し訳ありませんでした。

    2009年12月6日 4:29