如何创建Datagridview列来处理可空的bool?

时间:2011-04-28 17:02:12

标签: .net winforms datagridview nullable

我使用SqlDataAdapter在datagridview中显示SQL中的数据。 (这是一个C#Winforms应用程序,但这个问题可以很容易地应用于VB。)有些列是可以为空的bool。

目前,datagridview使用标准CheckBox列,该列使用空复选框为null和false,并选中复选框为true。

我想创建一个列,对于空值,根本不显示任何复选框。

解决此问题的最佳方法是什么?我想知道我是否应该创建一个继承自DataGridView并从那里继续的新控件。

4 个答案:

答案 0 :(得分:2)

这是我已经使用并且目前正在使用的解决方案:

((DataGridViewCheckBoxColumn)dgvDisplayData.Columns["field_name"]).ThreeState = true;

这是在数据绑定之后完成的,并假设sql字段“field_name”是可以为空的布尔值。 Resharper对这种格式不满意,提供了“可能的System.NullReferenceException”警告。

我仍然对替代/更好的建议感兴趣。

修改

我已将此更改为以下内容,以避免潜在的空值异常:

DataGridViewCheckBoxColumn chkCol =
    (DataGridViewCheckBoxColumn)dgvDisplayData.Columns["field_name"];
if (chkCol != null) chkCol.ThreeState = true;

答案 1 :(得分:1)

如果值为null,您还可以覆盖DataGridView的CellPainting事件,以选择性地绘制复选框。我偶尔会在一个应用程序中这样做:

private void MyDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) {
    if (e.ColumnIndex == MyCheckBoxColumn.Index && e.RowIndex >= 0) {
        var paintparts = e.PaintParts;
        if (e.Value == null) {
            paintparts &= ~DataGridViewPaintParts.ContentForeground;
        }
        e.Paint(e.ClipBounds, paintparts);
        e.Handled = true;
    }
}

这告诉网格视图,如果列的值为null(如果是 bool?值,就像我使用的那样 - 如果您使用的是数据库列,则可能需要进行比较 DBNull.Value ,不确定这一点)不绘制ContentForeground(包括复选框)。在所有其他情况下,绘画照常进行。

答案 2 :(得分:0)

最简单的方法可能是在后面的代码中的OnRowDatabound Eventhandler中处理这个问题。您可能还希望实现一个RowUpdating事件处理程序,该处理程序将设置null otherwize,您最终可能会错误地保存。

答案 3 :(得分:0)

创建一个带有复选框的模板列,将复选框的Enabled属性绑定到可空的bool的“HasValue”属性,并将复选框的checked属性绑定到nullableBool.HasValue ? nullableBool.Value : false