【问题标题】:Datagridview multiselect is not workingDatagridview 多选不起作用
【发布时间】:2013-01-15 10:58:27
【问题描述】:

我们有一个数据网格视图。它的 multiselect 属性设置为 true。 这个 datagridview 将在特定的时间间隔内更新它的行,比如一两秒。

所以假设我将选择一行,然后按住 shift 键并选择另一行,然后选择这两者之间的整行没有任何问题。

假设如果我选择一行,然后更新 gridview,然后如果我试图通过按住 shift 键选择另一行,那么它不会选择整行,而是选择最后点击的行。

所以我不确定它为什么会发生,所以如果我选择网格的第 2 行并且更新可能是这一行被下移到第 5 行,然后我试图选择另一行持有 shift键,则发生此错误。

任何人请就这个问题提出您的建议。

更新后选择代码

for (int nRow = 0; nRow < Grid.Rows.Count; nRow++)
{
  foreach (string cookieIdval in SelectedCookies)
  {
     if (Grid.Rows[nRow].Cells[ColCookieID].Value.ToString() == cookieIdval.ToString())
     {
       Grid.Rows[nRow].Cells[ColCookieID].Selected = true;
       break;
     }
  }
}

【问题讨论】:

  • 如何更新 datagridview?
  • 我对你的问题感到困惑。您是否希望在 Shift 选择时它不会选择其间的所有行?如果我理解错了,并且如果您想在更新时选择许多行,那对我来说听起来不是一件好事。
  • @hattenn :很抱歉造成混乱。我想要的是无论gridview是否更新,多选都应该适用于所有情况。即它应该在所有情况下选择多行..希望你清除这个..
  • 但是您的预期行为是什么?如果选择第一行和第十行之间的行,如果第二行移动到第 50 位?你还希望它被选中吗?那么当您选择行时,将使用哪种状态来选择数据行?更新前,还是更新后?
  • @HamletHakobyan :它使用订阅技术。因此,每当gridview中的某些属性或列发生变化时,它都会更新gridview。

标签: c# .net winforms datagridview


【解决方案1】:

你不能推迟更新直到这样的用户交互结束吗?

【讨论】:

  • 正如我所说,更新将在一秒钟内连续发生,我们不能推迟。
【解决方案2】:

修改您的更新方法,使其重新定位更新前已选择的内容。使用DataGridViewRow.SelectedDataGridView.CurrentRow 属性。

执行此操作的方式取决于填充 DataGridView 的方式。

编辑:

看来区分行的关键在ColCookieID 列。我们可以使用它来存储和恢复选定的行:

public void UpdateGridView()
{
    HashSet<string> selectedRows = new HashSet<string>();
    foreach (DataGridViewRow row in grid.Rows)
    {
        if (row.Selected)
            selectedRows.Add(row.Cells[ColCookieID].Value.ToString());
    }
    var currentRow = grid.CurrentRow.Cells[ColCookieID].Value.ToString()

    // ... update the grid

    foreach (DataGridViewRow row in grid.Rows)
    {
        var id = row.Cells[ColCookieID].Value.ToString();
        if (selectedRows.Contains(id))
            row.Selected = true;
        if (currentRow == id)
            grid.CurrentCell = row.Cells[0];
    }
}

让我知道它是否有效。

【讨论】:

  • 当前行是选中行列表的第一行。对吗?
  • @mahesh 不。我猜这是你点击的最后一行。
  • @mahesh 如果我们可以从更新程序方法中获得一些代码,那将会很有帮助。
  • @mahesh :-) 我只需要实际更新 DataGridView 的代码,而不是您在我回答后编写的代码。顺便说一句,你做得对。唯一剩下的就是CurrentRow。您应该在更新前存储它,并在更新后恢复它。
  • 啊原来的代码差不多就是这样而已..我只是修改了变量名和一些cmets..
【解决方案3】:

为了解决实际问题(刷新后shift键对多选不起作用)-这是通过设置修复的

dataGridView.CurrentCell = ...

(设置 CurrentCell 包含在接受的答案中,但未提及此具体问题)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2013-07-12
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多