解决 DataGridView特定行设置为CheckBox

tim8w

知名会员
已加入
2020年9月8日
留言内容
81
编程经验
10+
我需要将特定的行设置为CheckBox。我发现了许多设置整个列的示例。除了行,我需要相同的想法。有任何想法吗?
 
Solution
无法设置行中单元格的类型。该列控制着它所包含的单元格的模板,如果要在特定行中使用与该模板不同的单元格类型,则必须创建一个单独的单元格。您需要为每列执行此操作,例如
C#:
var rowIndex = 0;

for (var columnIndex = 0; columnIndex < myDataGridView.ColumnCount; columnIndex++)
{
    myDataGridView[columnIndex, rowIndex] = new DataGridViewCheckBoxCell();
}
Obviously you can set the rowIndex to whatever you need.

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,534
地点
悉尼,澳大利亚
编程经验
10+
无法设置行中单元格的类型。该列控制着它所包含的单元格的模板,如果要在特定行中使用与该模板不同的单元格类型,则必须创建一个单独的单元格。您需要为每列执行此操作,例如
C#:
var rowIndex = 0;

for (var columnIndex = 0; columnIndex < myDataGridView.ColumnCount; columnIndex++)
{
    myDataGridView[columnIndex, rowIndex] = new DataGridViewCheckBoxCell();
}
Obviously you can set the rowIndex to whatever you need.
 
解决方案

tim8w

知名会员
已加入
2020年9月8日
留言内容
81
编程经验
10+
无法设置行中单元格的类型。该列控制着它所包含的单元格的模板,如果要在特定行中使用与该模板不同的单元格类型,则必须创建一个单独的单元格。您需要为每列执行此操作,例如
C#:
var rowIndex = 0;

for (var columnIndex = 0; columnIndex < myDataGridView.ColumnCount; columnIndex++)
{
    myDataGridView[columnIndex, rowIndex] = new DataGridViewCheckBoxCell();
}
Obviously you can set the rowIndex to whatever you need.
这种工作。我得到错误"System.Format.Exception:单元格的格式化值具有错误的类型"。它确实显示了CheckBox,但是...
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,534
地点
悉尼,澳大利亚
编程经验
10+
错误消息告诉您确切的问题是什么。如果您不知道该怎么办,那么您将必须提供有关该问题的完整解释。有什么数据?它从哪里来的?等等。
 

tim8w

知名会员
已加入
2020年9月8日
留言内容
81
编程经验
10+
错误消息告诉您确切的问题是什么。如果您不知道该怎么办,那么您将必须提供有关该问题的完整解释。有什么数据?它从哪里来的?等等。
我正在尝试创建类似于MS Access数据库中存在的查询生成器。这很简单,因为用户只能为一个表建立查询。所以我有一个DataGridView,它将显示与suer选择的一样多的字段。在屏幕截图中,我刚刚开始研究"Date"场地。 DataGridView在列中显示每个选定的字段,并且这些列包含3种不同类型的单元格。排"Sort"包含一个ComboBox,行"Show"包含一个CheckBox和一行"Criteria"包含一个按钮。添加每行之后,然后每次鼠标经过单元格时,屏幕快照都会显示错误。

1608618625530.png


您还需要其他什么来帮助我吗?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,539
地点
弗吉尼亚州切萨皮克
编程经验
10+
啊!上面的主要问题是,该下部窗格使用了错误的UI。您不应该使用DataGridView来显示本质上的属性。您应该使用PropertyGrid。

 

tim8w

知名会员
已加入
2020年9月8日
留言内容
81
编程经验
10+
啊!上面的主要问题是,该下部窗格使用了错误的UI。您不应该使用DataGridView来显示本质上的属性。您应该使用PropertyGrid。

我可以在前两行中使用PropertyGrid,但是我需要让用户加载CriteriaBuilder表单才能为查询建立条件。我的用户不太了解SQL查询。我从未尝试从PropertyGrid内部启动表单。那有可能吗?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,534
地点
悉尼,澳大利亚
编程经验
10+
I don't think that the PropertyGrid is the answer here. If you check out the Query Builder is VS, the UI is pretty much as shown above. It allows all parameters to be viewed and configured simultaneously.

I haven't tested but I suspect that the issue here is that the check box cell expects a value of either true 或者 false while the value is null by default. If you were to simply set the Value of the cell to false by default then I suspect that it would work.
 

tim8w

知名会员
已加入
2020年9月8日
留言内容
81
编程经验
10+
I don't think that the PropertyGrid is the answer here. If you check out the Query Builder is VS, the UI is pretty much as shown above. It allows all parameters to be viewed and configured simultaneously.

I haven't tested but I suspect that the issue here is that the check box cell expects a value of either true 或者 false while the value is null by default. If you were to simply set the Value of the cell to false by default then I suspect that it would work.
你是对的。我刚刚在下面的代码中做到了:

C#:
dgvQuery.Rows.Add();
DataGridViewComboBoxCell cbCell = new DataGridViewComboBoxCell();
cbCell.Items.Add("Ascending");
cbCell.Items.Add("Descending");
cbCell.Items.Add("[not sorted]");
dgvQuery[e.Index, 0] = cbCell;
dgvQuery[e.Index, 0].Value = "[not sorted]";
dgvQuery.Rows[0].HeaderCell.Value = "Sort";

dgvQuery.Rows.Add();
DataGridViewCheckBoxCell chkCell = new DataGridViewCheckBoxCell();
dgvQuery[e.Index, 1] = chkCell;
dgvQuery[e.Index, 1].Value = false;
dgvQuery.Rows[1].HeaderCell.Value = "Show";

dgvQuery.Rows.Add();
DataGridViewButtonCell btnCell = new DataGridViewButtonCell();
btnCell.Value = "Edit";
dgvQuery[e.Index, 2] = btnCell;
dgvQuery.Rows[2].HeaderCell.Value = "Criteria";

现在剩下的唯一问题是如何检测按钮上的单击?
 
最佳 底部