DataGridViewCheckBoxColumn获取状态
本文关键字:状态 获取 DataGridViewCheckBoxColumn | 更新日期: 2023-09-27 18:23:52
我有一个DataGridView dgView,我用几个不同的窗体填充它,例如DataGridViewCheckBoxColumn。为了处理事件,我添加了
private void InitializeComponent()
{
...
this.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgView_CellClick);
...
}
实现看起来像:
private void dgView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (Columns[e.ColumnIndex].Name == "Name of CheckBoxColumn") // this is valid and returns true
{
Console.WriteLine("Handle single click!");
// How to get the state of the CheckBoxColumn now ??
}
}
这就是我陷入困境的地方。我已经尝试了不同的方法,但没有成功:
DataGridViewCheckBoxColumn cbCol = Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewCheckBoxColumn; // does not work
DataGridViewCheckBoxColumn cbCol = (DataGridViewCheckBoxColumn)sender; // nor this
if (bool.TryParse(Rows[e.RowIndex].Cells[e.ColumnIndex].EditedFormattedValue.ToString(), out isBool)) // nor this
{ ... }
有人能指出如何检索这个复选框列的状态吗?此外,是否存在直接寻址CheckBoxColumn的其他事件?(例如"ValueChanged"之类的)
更新:方法
DataGridViewCell dgvCell = Rows[e.RowIndex].Cells[e.ColumnIndex];
Console.WriteLine(dgvCell.Value);
至少在之前的时间点返回true/false通过单击单元格更改(或不更改)值。但总的来说,应该有一个直接处理CheckBoxColumn的解决方案。
解决方案:有时答案太明显了,看不见。我面临的问题是,在单击单元格和复选框时都会触发事件"CellClick"。因此,正确的处理方法是使用"CellValueChanged"事件:
private void InitializeComponent()
{
...
this.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgView_CellValueChanged);
...
}
要确定复选框的值,我使用与上述相同的方法:
if (e.ColumnIndex != -1 && Columns[e.ColumnIndex].Name == "Name of Checkbox")
{
bool cbVal = Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
}
操作UI组件的一种方法是使用数据绑定。参见示例:
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="Online Order?" IsThreeState="True" Binding="{Binding OnlineOrderFlag}" />
</DataGrid.Columns>
此链接详细解释了DataGrid的用法。但不管怎样,你有没有试过对发送者进行快速观察,看看它是什么类型的?
您可以将单元格强制转换为复选框,并检查是否在那里选中了它。。。
CheckBox chkb = (CheckBox)Rows[e.RowIndex].FindControl("NameOfYourControl");
然后只需对照chkb进行检查
if (chkb.Checked == true)
{
//do stuff here...
}
您可以简单地将单元格的值强制转换为布尔
//check if it's the good column
bool result = Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
编辑:我可能在你的问题中遗漏了一些东西,但如果你更新/添加细节,我会看看
编辑2:评论后,
如果你想在单元格中进行单击,只需反转它给你的值。
bool result = !Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
正确的处理方法是使用"CellValueChanged"事件:
private void InitializeComponent()
{
...
this.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgView_CellValueChanged);
...
}
要确定复选框的值:
private void dgView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex != -1 && Columns[e.ColumnIndex].Name == "Name of Checkbox")
{
Console.WriteLine( Rows[e.RowIndex].Cells[e.ColumnIndex].Value );
}
}