编辑排序列值在DataGridView
本文关键字:DataGridView 排序 编辑 | 更新日期: 2023-09-27 18:03:30
我有一个DataGridView,它允许用户通过首先选择几行并从上下文菜单中选择一个值来同时设置多行中的值。我通过遍历所有选定的行来实现这一点,将每行的适当列设置为指定的值。如果DataGridView没有按被修改的列排序,那么这可以很好地工作,但是如果您试图修改排序列中的值,通常会有一些值最终不会被更改。
如果我有一个这样的表按第三列排序:
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"列表是由索引定义的,如果行在"SelectedRows"迭代时重新排列,这导致一些行获得两次值设置,而另一些行根本没有获得值设置。是否有可能暂停重新排序直到迭代完成,或者是否有另一种方法来确保每个选定的行都被修改一次?
编辑:顺便说一下,设置列"SortMode"为"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;
虽然很麻烦,但还是有同样的问题
对不起,我还不允许评论,但是你试过通过SelectedRows集合的索引循环吗?通过显式引用索引,行在SelectedRows集合中出现的顺序将不再重要。
例如,for (int index = 0; index < SelectedRows.Count; index ++)
{
SelectedRows.SelectedRow[index].column[column] = newValue;
}
我明白了,对不起:(另一个想法,我必须用蛮力修复它是添加一个计数器变量,像这样:
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;
}
这样,每次进行更改时,您都会在计数器变量中跟踪它,然后继续重复该操作,直到每个选定的行都被更改。
我在使用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上看到了这篇文章:DataGridView中的选定行没有正确排序。
Amro在帖子中的回应建议在选择之外设置DataGridView的CurrentCell属性。为了使这个工作,我必须做更多的事情:
- 将
CurrentCell
设置在SelectedRows
之外 - 修改行。现在,新值被正确地应用到右行,但是其中一行出现在网格中的错误位置。
- 要解决这个问题,遍历所有行设置任何一个单元格当前。
- 重新选择用户在移动后仍然希望被选中的行
多啰嗦啊!