首页 > 解决方案 > 当我设置单元格值时,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:  }

看起来很简单,我想。不幸的是,当我使用断点和调试器进行跟踪时,会发生这种情况:

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

编辑

这似乎仅在以编程方式从另一个表单更改所选行之后才会发生。例如,如果我设置 currentRows[n].Selected = false;然后 set Rows[n+1].Selected = true;,则上述功能会以所述方式失败。但是,如果我先执行此选择修改,则不会发生错误(SelectedRows 属性保持不变)。

与此同时,我正在通过对函数的以下更新成功地解决了这个问题,但似乎没有必要,所以我很想知道是什么导致了这种奇怪的效果。

1:  // Workaround
2:  public static void WriteDGVCellValueByRowAndCol<T>(DataGridView dgv, int row, int column, 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副作用之外,这个函数正在被传递给另一个表单,并且按预期工作。

标签: winformsdatagridview

解决方案


推荐阅读