向您的 DataGrid 添加 CheckBox 列






4.79/5 (118投票s)
一个可以在 DataGrid 中使用和绑定的 CheckBox 列
引言
许多文章解释了如何在 DataGrid 中添加控件,这些控件可以用于以 EditBox 以外的格式表示和编辑数据,但是它们似乎都需要程序员编辑 .aspx 页面中的 html,而不是仅仅使用 .cs 代码隐藏文件中的代码。过去,我必须实现许多不同的控件,这些控件可以用来表示和编辑 DataGrid
中的控件,在这里我将演示带有绑定 CheckBox 的 CheckBox 模板列,因为它既是最简单的,也是除了 EditBox 之外最常用的控件之一,用于编辑布尔类型字段。
ITemplate 实现
在我们实现将用作 DataGrid 中的列的类之前,需要创建一个派生自 ITemplate
的类,该类可以用于表示和/或编辑网格中的数据。在大多数情况下,需要定义一个单独的类用于显示和编辑,例如包含一个标签控件或一个编辑框控件。幸运的是,我们可以使用相同的控件 CheckBox 来表示布尔状态以及编辑它。
public CheckBoxItem(bool editable)
{
readOnly = (editable==true)?false:true;
}
处理 DataBinding 事件
因为 CheckBox 控件将表示 DataGrid 中保存的数据,所以它需要处理 DataBinding
事件,该事件将为 DataGrid 中的每一行调用一次。这可以在 InstantiateIn
方法实现中进行设置,这是 ITemplate
接口的唯一方法。
void ITemplate.InstantiateIn(Control container)
{
CheckBox box = new CheckBox();
box.DataBinding += new EventHandler(this.BindData);
container.Controls.Add(box);
}
处理 DataBinding 事件
DataBinding
事件的处理程序用于设置控件的状态,具体取决于底层 DataGrid 中的数据,以及设置可编辑状态,具体取决于它是用于查看数据还是编辑数据。
public void BindData(object sender, EventArgs e)
{
CheckBox box = (CheckBox) sender;
DataGridItem container = (DataGridItem) box.NamingContainer;
box.Checked = false;
box.Enabled = (readOnly == true) ? false:true;
string data = ((DataRowView) container.DataItem)[dataField].ToString();
Type type = ((DataRowView)
container.DataItem).DataView.Table.Columns[dataField].DataType;
if (data.Length>0)
{
switch (type.ToString())
{
case "System.Boolean":
if ( data == "True")
{
box.Checked = true;
}
break;
default:
break;
}
}
}
CheckBox 模板列
将用作 DataGrid 中的列的类将派生自 System.Web.UI.WebControls.TemplateColumn
类。我们将上述 ITemplate
实现类的对象添加到 ItemTemplate
属性(用于显示)和 EditItemTemplate
属性(用于编辑)。
public CheckBoxColumn()
{
// set the view one as readonly
viewItem = new CheckBoxItem(false);
this.ItemTemplate = viewItem as ITemplate;
// let the edit check box be editable
editItem = new CheckBoxItem(true);
this.EditItemTemplate = editItem as ITemplate;
}
将列添加到 DataGrid
倒数第二步是将列添加到 DataGrid 本身。由于我们设计类的方式,这非常简单,因为它可以代替 BoundColumn
使用。
CheckBoxColumn checkCol = new CheckBoxColumn();
checkCol.HeaderText = "Boolean Field (Editable)";
checkCol.DataField = "Boolean";
...
DataGrid1.Columns.Add(checkCol);
提取更新后的状态
最后一步是从控件本身提取数据,以便更新或插入行。同样,我们使用与通常采用的方法类似的方法,但是我们使用 CheckBox
而不是 TextBox
。
sqlUpdateCommand1.Parameters["@Boolean"].Value
= ((CheckBox)e.Item.Cells[4].Controls[0]).Checked;
AutoPostBack 和接收 CheckedChanged 事件
最近有人问是否可以从列中包含的 CheckBox 接收 CheckedChanged
事件。我已经更新了代码以处理以下情况:你有一个带有 CheckGridColumn 的 DataGrid,并且可以立即更新字段。

要将一个处理此情况的列添加到我们的 DataGrid,我们执行以下操作。
CheckBoxColumn checkCol2 = new CheckBoxColumn(true);
checkCol2.HeaderText = "Boolean Field (Always Editable)";
checkCol2.DataField = "Boolean";
// this is our handler for all of the CheckBoxes CheckedChanged events
checkCol2.CheckedChanged += new EventHandler(this.OnCheckChanged);
...
DataGrid2.Columns.Add(checkCol2);
现在,因为我们需要处理事件来更改我们的数据库条目,所以我们需要从 DataGrid 中提取相关信息,并提取 CheckBox 的状态。以下示例显示了如何做到这一点。private void OnCheckChanged(object sender, EventArgs e)
{
CheckBox box = (CheckBox) sender;
DataGridItem container = (DataGridItem) box.NamingContainer;
// get our values
sqlUpdateCommand1.Parameters["@Object_id"].Value
= int.Parse(container.Cells[0].Text);
sqlUpdateCommand1.Parameters["@Boolean"].Value = box.Checked;
...
}
文档
代码已使用///文档语法记录。我更喜欢使用 NDOC,可以在 Sourceforge 上找到它,作为我的文档生成引擎。它还处理 Microsoft 创建然后忘记的所有那些标签。
文章历史
2002 年 7 月 29 日 - 发布原始文章
2002 年 9 月 3 日 - 更新了带有注释源代码的文章
反馈
你的反馈对我来说很重要,我总是愿意做出改进。如果你觉得这篇文章有用,请不要忘记投票。
</body></html>