0

我有一个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 的状态吗?此外,是否存在任何其他事件直接解决 CheckBoxColumn ?(比如“ValueChanged”什么的)

更新: 方法

DataGridViewCell dgvCell = Rows[e.RowIndex].Cells[e.ColumnIndex];
Console.WriteLine(dgvCell.Value);

至少在通过单击单元格更改(或不更改)值之前的时间点返回真/假。但总而言之,应该有一个直接解决 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;
 }
4

4 回答 4

0

操作 UI 组件的一种方法是使用数据绑定。参见例如

 <DataGrid.Columns>
    <DataGridCheckBoxColumn Header="Online Order?" IsThreeState="True" Binding="{Binding OnlineOrderFlag}" />
</DataGrid.Columns>

链接详细解释了 DataGrid 的用法。但无论如何,您是否尝试过对发件人进行 QuickWatch 以查看它的类型?

于 2013-07-18T15:26:22.860 回答
0

你可以将单元格投射到一个复选框并检查它是否在那里被选中......

CheckBox chkb = (CheckBox)Rows[e.RowIndex].FindControl("NameOfYourControl");

然后只需检查 chkb

if (chkb.Checked == true)

{
 //do stuff here...
}
于 2013-07-18T15:29:28.057 回答
0

您可以简单地将单元格的值转换为 bool

//check if it's the good column
bool result = Rows[e.RowIndex].Cells[e.ColumnIndex].Value;

编辑:我可能在你的问题中遗漏了一些东西,但如果你更新/添加细节,我会看看

编辑2:评论后,

如果您想在 cellClick 中执行此操作,只需反转它给您的值。

bool result = !Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
于 2013-07-18T15:32:49.773 回答
0

正确的处理是使用“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 );
     }
}
于 2013-07-19T07:50:54.847 回答