在DataGridView中编辑排序列值

时间:2015-07-20 15:06:45

标签: c# sorting datagridview edit

我有一个DataGridView,允许用户通过先选择多行并从上下文菜单中选择一个值,同时在多行中设置一个值。我通过迭代所有选定的行来实现这一点,将每行的相应列设置为指定的值。如果DataGridView没有被修改的列排序,那么这很有效,但是如果您尝试修改已排序列中的值,则某些值通常不会被更改。

所以,如果我有一个像第3列那样排序的表:

x  x  T*  x
x  x  T*  x
x  x  T*  x
x  x  F   x
x  x  F   x

并且您希望将第三列中的所有值设置为" F"你应该能够选择前三行并将第三列的值设置为" F"但我认为发生的是,当程序迭代选定的行时,它们会改变顺序,你经常最终得到:

x  x  T*  x
x  x  F*  x
x  x  F*  x
x  x  F   x
x  x  F   x

我认为正在发生的是" SelectedRow" list由index定义,如果在迭代#34; SelectedRows"之前重新排列行。这会导致某些行将其值设置两次,而其他行则根本无法设置其值。是否有可能暂停重新排序直到迭代完成,或者是否有另一种方法可以确保每个选定的行只被修改一次?

编辑:顺便说一句,设置列" SortMode" to" NotSortable"似乎没有帮助。

如:

DataGridViewColumnSortMode temp = dgv[currenttab].Columns["column"].SortMode;
dgv[currenttab].Columns["column"].SortMode = AataGridViewColumnSortMode.NotSortable;

foreach (DataGridViewRow row in dgv[currenttab].SelectedRows) {
    row.Cells["column"].Value = "F";
}

dgv[currenttab].Columns["colour"].SortMode = temp;

虽然很麻烦但仍然存在同样的问题。

3 个答案:

答案 0 :(得分:0)

抱歉,我还没有发表评论,但您是否尝试过循环使用SelectedRows集合的索引了?通过显式引用索引,行在SelectedRows集合中出现的顺序应该不再重要。

例如,

for (int index = 0; index < SelectedRows.Count; index ++)
{
    SelectedRows.SelectedRow[index].column[column] = newValue;
 }

答案 1 :(得分:0)

我明白了,抱歉:(另一个想法我必须用蛮力修复它是添加一个计数器变量,如下所示:

Do until (x == SelectedRows.Count)
{   
for each(DataGridViewRow row in dgv[currenttab].SelectedRows)     
{
if(row.Cells["column"].Value != newValue)
{
row.Cells["column"].Value == newValue;
x+=1;
}

这样,每次进行更改时,您都会在计数器变量中跟踪它,然后继续重复操作,直到每个选定的行都被更改为止。

答案 2 :(得分:0)

我使用C#遇到了类似的问题。我找到了两件应该有用的东西。首先,这个循环:

Do until (x == SelectedRows.Count)
{   
  for each(DataGridViewRow row in dgv[currenttab].SelectedRows)     
  {
    if(row.Cells["column"].Value != newValue)
    {
      row.Cells["column"].Value == newValue;
      x+=1;
    }

不能可靠地工作,因为您将排序列设置为新值的瞬间它可以移动到网格中的新位置,SelectedRows集合基本上已损坏。如果你解决这个问题,例如通过以反向索引顺序迭代,如果您知道修改可能会在表中稍后移动一个或多个行,则仍会出现问题,因为当您以编程方式更改排序键时,所选行不能正确排序;有些行移动到正确的新位置,有些则没有!

我在MSDN上发现了这篇文章: Selected Row in DataGridView is not properly sorted

Amro在帖子中的回复建议在选择之外设置DataGridView的CurrentCell属性。为了完成这项工作,我必须做更多的事情:

  1. CurrentCell以外的某处设置SelectedRows
  2. 修改行。现在,新值正确应用于右侧行,其中一行显示在网格中的错误位置。
  3. 要修复此迭代所有行,将其中任何一个单元设置为当前。
  4. 重新选择用户在移动后仍希望选择的行。
  5. 多么好的一块!