【问题标题】:DataGridView CurrentRow excludes new rowDataGridView CurrentRow 排除新行
【发布时间】:2010-11-20 00:40:03
【问题描述】:

我想获取我的 DataGridView 的当前行的索引。问题是,如果当前行是新行,则 CurrentRow 被设置为不是新行的最后一行。我无法检查要选择的行,因为如果选择了一行并不意味着它是当前行并且不一定选择当前行。

我可以得到新行的索引,但是如何知道新行是否是当前行?

【问题讨论】:

  • 嗨,在某种程度上我明白你的意思,但我不明白为什么你必须使用 currentRow 你想用它做什么?最好的问候,约旦
  • 我想在用户单击按钮时用值填充当前行的单元格。如果该行恰好是新行,则应创建该行并用该值填充单元格。

标签: c# datagridview indexing newrow


【解决方案1】:

我通过以下代码连接到 CellClick 事件:

private void uiEntries_CellClick(object sender, DataGridViewCellEventArgs e)
{
    Console.WriteLine(e.RowIndex == uiEntries.NewRowIndex);
}

当该条件为真时,用户“选择”了新行。根据该信息,您可能需要实际插入一条新记录(使用 ..Rows.Add() 方法),然后才能对其进行实际操作,因为新行实际上并不存在于集合中;它只是作为占位符来代表新行。

【讨论】:

  • 您的解决方案存在一个缺陷:当用户不是通过单击而是通过使用键盘来更改当前单元格时,这将不起作用。 CurrentCellChanged 事件将起作用,但这不会发送单元格。
  • 那么您可能还需要捕捉击键,看看您是否应该响应“移动”。例如,如果它是最后一行旁边的“向下箭头”,则表示(也许?)用户正在尝试添加一行。然后,您可以执行与上述相同的步骤(插入新记录等)。
  • 虽然很麻烦,但我认为这就是解决方案。非常感谢!
【解决方案2】:

这个属性值能解决你的问题吗?

dataGridView1.CurrentCell.RowIndex

【讨论】:

    【解决方案3】:

    我使用 CellEnter 事件将 CurrentCell.RowIndex 保存到表单变量中。单击另一个按钮会导致此事件使用最后一个现有行索引而不是我们需要的新行索引触发,因此测试焦点以忽略该情况。

    这避免了像使用 CellClick 事件一样检查所有可能将光标移动到新行的键和鼠标操作。

    从 VB 自动转换的代码:

    private int ActualCurrentRowIndex;
    
    private void DataGridView1_CellEnter(object sender, System.Windows.Forms.DataGridViewCellEventArgs e)
    {
        if (DataGridView1.Focused) {
            ActualCurrentRowIndex = DataGridView1.CurrentCell.RowIndex;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2011-12-30
      • 1970-01-01
      • 2016-06-28
      • 2011-01-02
      • 1970-01-01
      相关资源
      最近更新 更多