65.9K
CodeProject 正在变化。 阅读更多。
Home

向您的 DataGrid 添加 CheckBox 列

2002年7月30日

CPOL

3分钟阅读

viewsIcon

1784277

downloadIcon

13102

一个可以在 DataGrid 中使用和绑定的 CheckBox 列

Sample Image - checkgrid.jpg

引言

许多文章解释了如何在 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,并且可以立即更新字段。

Sample Image - checkgrid2.jpg

要将一个处理此情况的列添加到我们的 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>
© . All rights reserved.