トップ回答者
CheckBoxField 有効化

質問
-
お世話になっております。
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(); }
回答
-
> 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
すべての返信
-
> 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