点击DataGridView表头自动排序后,更改的Cell值,过程中DataView行序改变??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点击DataGridView表头自动排序后,更改的Cell值,过程中DataView行序改变??相关的知识,希望对你有一定的参考价值。

我将DataGridView1绑定到一个DataTable,显示出数据后,我点击DataGridView的头,自动排序一下,然后再用鼠标点击选取几个Cell,然后点击按钮将这些选中的所有的Cell值给改变。。结果在改变的过程当中。。数据的顺序有所改变,导致改变的结果不对,大家帮忙看看是为什么。
主要代码如下:
DataTable table = new DataTable();
//...省略连接数据库部分
sqldataAdapter.Fill(table);
dataGridView1.DataSource = table;
//此时点击DataGridView任意一列的表头,显示数据重新排列了
//然后点选多个Cell,然后点击一个按钮进行修改。
foreach (DataGridViewCell item in dataGridView1.SelectedCells)

Console.WriteLine("修改前的item的值为" + dataGridView1.Rows[item.RowIndex].Cells[0].Value);
Console.WriteLine("修改前的item行数为" + item.RowIndex);
Console.WriteLine("------------");

item.Value = "3";
Console.WriteLine("修改后的item的值为" + dataGridView1.Rows[item.RowIndex].Cells[0].Value);
Console.WriteLine("修改后的item行数为" + item.RowIndex);
Console.WriteLine("------------");


在跟踪Console显示的过程中,发现某一次更改完item.value后,该item所在的行数就变了,这样,就会出现问题,比如我要更改的Cell本来在2,3,4,5行,但是更改第二行那个Cell完后,该Cell的行数就会变成第4行,这样第4次Foreach的循环找到的item,就是第二次更改过的,而本来应该该的第5行就没有被改,大家帮忙看看啊,着急啊!
前提是在选取Cell前,先点击一下DataGridView的任意一列表头自动排序一下。
如果我点击DataGridView的表头自动排列时,点击的不是我需要修改的那个字段所在的列,不会出错。
如果我想修改的就是第二列,在之前的排序我点击的是该列自动排序,然后再修改就会有问题。

回3楼的,dataGridView.SortOrder属性是只读的。

我以为DataGridView会有一些比如:
BeginUpdate/BeginSort,EndUpdate/EndSort之类的方法的呢,可惜没有找到对应的。在一些第三方控件有,比如DevExpress,这种有排序的情况下更新问题就可以这样:
EndSort()//停止排序
//你的更新datagridview的代码
// TODO:
BeginSort()//继续排序

解决方案你可以模仿这个做:

DataGridViewColumn _sortedColumn;
SortOrder _sortOrder;

//在你更新之前继续下一些必要的信息:
_sortedColumn = dataGridView1.SortedColumn;
_sortOrder = dataGridView1.SortOrder;

// 将目前的SortOrder设置为None来停止排序
dataGridView1.SortOrder = SortOrder.None;

//你的更新datagridview的代码填写在这里:
// TODO:

//更新完了之后回复SortOrder
dataGridView1.SortedColumn = _sortedColumn;
dataGridView1.SortOrder = _sortOrder;
=====================================================================
即使是只读的你也应该可以通过其它方式设置,肯定可以通过编程设置sortorder属性的。

DataGridViewColumn _sortedColumn;
SortOrder _sortOrder;
DataGridViewColumnSortMode _sortMode;

_sortedColumn = dataGridView1.SortedColumn;
_sortOrder = dataGridView1.SortOrder;
_sortMode = dataGridView1.Columns[_sortedColumn.Name].SortMode;

if (_sortOrder != SortOrder.None)

// 存在sortorder,就remove掉
dataGridView1.Columns[_sortedColumn.Name].SortMode = DataGridViewColumnSortMode.NotSortable;


foreach (DataGridViewCell item in dataGridView1.SelectedCells)

Console.WriteLine("Before Value:" + dataGridView1.Rows[item.RowIndex].Cells[1].Value);
Console.WriteLine("Before Index:" + item.RowIndex);
Console.WriteLine("------------");

item.Value = "4";
Console.WriteLine("After Value:" + dataGridView1.Rows[item.RowIndex].Cells[1].Value);
Console.WriteLine("After Index:" + item.RowIndex);
Console.WriteLine("------------");


if (_sortOrder != SortOrder.None)

dataGridView1.Columns[_sortedColumn.Name].SortMode = DataGridViewColumnSortMode.Programmatic;
if (_sortOrder == SortOrder.Ascending)

dataGridView1.Sort(_sortedColumn, ListSortDirection.Ascending);

else

dataGridView1.Sort(_sortedColumn, ListSortDirection.Descending);

dataGridView1.Columns[_sortedColumn.Name].SortMode = _sortMode;
参考技术A 这里取的是行标,但是因为你排序过,可能在修改其中的值后,触发了又一次排序的事件,所以可能出现你说描述的错位的现象。
取出主键,然后修改
参考技术B 我遇到过这种问题
重新绑定一下,然后重新设置一下焦点
参考技术C 把主键取出来 根据主键更改才是正解 参考技术D 下午有时间hi我.帮改

以上是关于点击DataGridView表头自动排序后,更改的Cell值,过程中DataView行序改变??的主要内容,如果未能解决你的问题,请参考以下文章

怎么把datagridview中的自动排序功能禁用

c# datagridview 排序

点击datagridview的列标题为啥不自动排序

c# datagridview 设置某列为日期

C# datagridview绑定集合,怎样点击列标题使之排序

winform中datagridview怎么把表头分为两列