设置单元格值时,WinForms DataGridView是否清除SelectedRows?

问题描述

我正在以编程方式修改DGV单元的值。由于某些原因,这将清除DGV的SelectedRows属性。这是我的代码
1:  public static void WriteDGVCellValueByRowAndCol<T>(DataGridView dgv,int row,int column,T newValue)
2:  {
3:      dgv.Rows[row].Cells[column].Value = newValue;
4:  }

我想似乎很简单。不幸的是,当我使用断点和调试器进行跟踪时,会发生以下情况:

  • 在执行第3行之前,调试器将显示dgv.SelectedRows.Count == 1
  • 执行第3行后,调试器将显示dgv.SelectedRows.Count == 0

DGV本身保持不变,并且单元格值正在更新,但是SelectedRows属性正在清空,因此其Count为0。为什么会发生这种情况,我该怎么做才能防止它发生?

修改

这似乎是在还通过编程方式从另一种形式更改所选行之后出现的。例如,如果我设置了当前的Rows[n].Selected = false;,然后又设置了Rows[n+1].Selected = true;,则上述功能将以上述方式失败。但是,如果我先执行此选择修改,则不会发生任何错误(SelectedRows属性保持不变)。

在此期间,我通过对函数的以下更新成功解决了此问题,但似乎没有必要,因此,我希望能帮助您找出导致这种奇怪效果的原因。

1:  // Workaround
2:  public static void WriteDGVCellValueByRowAndCol<T>(DataGridView dgv,T newValue)
3:  {
4:      dgv.Rows[row].Cells[column].Value = newValue;
5:      dev.Rows[row].Selected = true;
6:  }

为清楚起见,以下函数用于以编程方式修改选择:

private void SelectNext()
{
    int currentIndex = myDGV.SelectedRows[0].Index;
    int newIndex = currentIndex;
    if (currentIndex == myDGV.RowCount - 1)
    {
        Log("The last row was already selected.  Wrapping to the first row.");
        newIndex = 0;
    }
    else newIndex++;

    myDGV.Rows[currentIndex].Selected = false;
    myDGV.Rows[newIndex].Selected = true;
}

功能正在使用Func<...>传递给另一种形式,并且可以正常工作,除了这种SelectedRows副作用之外。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)