C# Datagridview multiselect不工作

C# Datagridview multiselect不工作,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,我们有一个datagridview。其multiselect属性设置为true。 这个datagridview将在一个特定的时间间隔内更新它的行,比如说一两秒 因此,假设我将选择一行,然后按住shift键并选择另一行,那么这两行之间的整行将被选中,而不会出现任何问题 假设我选择了一行,然后gridview被更新,然后如果我试图通过按住shift键选择另一行,那么它不会选择整行,而是选择最后单击的行 所以我不知道为什么会发生这种情况,所以如果我选择网格的第二行,更新可能是这一行向下移动,比如说第五

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

因此,假设我将选择一行,然后按住shift键并选择另一行,那么这两行之间的整行将被选中,而不会出现任何问题

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

所以我不知道为什么会发生这种情况,所以如果我选择网格的第二行,更新可能是这一行向下移动,比如说第五行,然后我试图选择另一行按住shift键,那么这个错误就发生了

请大家就这个问题提出建议

更新后选择的代码
for(int nRow=0;nRow
您不能将更新推迟到用户交互结束吗?

您不能将更新推迟到用户交互结束吗?

修改您的更新方法,使其恢复更新之前选择的内容。使用和属性

执行此操作的方式取决于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];
    }
}
public void UpdateGridView()
{
HashSet selectedRows=新HashSet();
foreach(grid.Rows中的DataGridViewRow行)
{
如果(选定行)
selectedRows.Add(row.Cells[ColCookieID].Value.ToString());
}
var currentRow=grid.currentRow.Cells[ColCookieID].Value.ToString()
//…更新网格
foreach(grid.Rows中的DataGridViewRow行)
{
var id=row.Cells[ColCookieID].Value.ToString();
if(selectedRows.Contains(id))
row.Selected=true;
if(currentRow==id)
grid.CurrentCell=行.单元格[0];
}
}

让我知道它是否有效。

修改您的更新方法,使其恢复更新前选择的内容。使用和属性

执行此操作的方式取决于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];
    }
}
public void UpdateGridView()
{
HashSet selectedRows=新HashSet();
foreach(grid.Rows中的DataGridViewRow行)
{
如果(选定行)
selectedRows.Add(row.Cells[ColCookieID].Value.ToString());
}
var currentRow=grid.currentRow.Cells[ColCookieID].Value.ToString()
//…更新网格
foreach(grid.Rows中的DataGridViewRow行)
{
var id=row.Cells[ColCookieID].Value.ToString();
if(selectedRows.Contains(id))
row.Selected=true;
if(currentRow==id)
grid.CurrentCell=行.单元格[0];
}
}

让我知道它是否工作。

为了解决实际问题(刷新后shift键不适用于multiselect)-这通过设置

dataGridView.CurrentCell = ...

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

为了解决实际问题(刷新后shift键不适用于multiselect)-这通过设置来解决

dataGridView.CurrentCell = ...

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

您如何更新datagridview?我对您的问题感到困惑。当您按住Shift键选择时,是否希望它不会选择中间的所有行?如果我理解错了,如果你想在更新行的同时选择多行,对我来说这听起来不是一件好事。@hattenn:很抱歉造成混淆。我想要的是,无论gridview是否更新,multiselect都应该在所有情况下工作。ie在所有情况下都应选择多行。。希望你明白这一点。但是你期望的行为是什么?如果您选择第一行和第十行之间的行,如果第二行移动到第50位?是否仍要选择它?因此,当您选择行时,将使用哪个状态来拾取数据行?更新之前还是之后?@HamletHakobyan:它使用了一种包容技术。因此,每当gridview中的某些属性或列发生更改时,它都会更新gridview。您如何更新datagridview?我对您的问题感到困惑。当您按住Shift键选择时,是否希望它不会选择中间的所有行?如果我理解错了,如果你想在更新行的同时选择多行,对我来说这听起来不是一件好事。@hattenn:很抱歉造成混淆。我想要的是,无论gridview是否更新,multiselect都应该在所有情况下工作。ie在所有情况下都应选择多行。。希望你明白这一点。但是你期望的行为是什么?如果您选择第一行和第十行之间的行,如果第二行移动到第50位?是否仍要选择它?因此,当您选择行时,将使用哪个状态来拾取数据行?更新之前还是之后?@HamletHakobyan:它使用了一种包容技术。因此,每当gridview中的某些属性或列发生更改时,它都会更新gridview。正如我所说,更新在一秒钟内持续进行,我们不能推迟。正如我所说,更新在一秒钟内持续进行,我们不能推迟。当前行是选定行列表中的第一行。是吗?@mahesh不。我想这是你点击的最后一行了。@mahesh没有