我使用SqlDataAdapter在datagridview中显示SQL中的数据。 (这是一个C#Winforms应用程序,但这个问题可以很容易地应用于VB。)有些列是可以为空的bool。
目前,datagridview使用标准CheckBox列,该列使用空复选框为null和false,并选中复选框为true。
我想创建一个列,对于空值,根本不显示任何复选框。
解决此问题的最佳方法是什么?我想知道我是否应该创建一个继承自DataGridView并从那里继续的新控件。
答案 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