问题描述
绑定数据源的 DataGridView 控件,列排序方式为 Automatic (允许用户点击列表头自动排序)
1. 在点击某列表头排序前,修改该列单元格内容,不会自动排序。这是预期的
2. 在点击某列表头排序后,DataGridView 根据该列自动排序。这是预期的
3. 在点击某列表头排序后,修改该列单元格内容,回车或者离开该单元格所属行后,会自动排序。这不是预期的
说明
(1) 该现象只出现在点击列表头进行过排序操作的列
(2) 设置列排序方式为 NotSortable 只禁止了用户通过点击列表头进行排序的操作,无法禁止该列数据变动后自动排序
(3) 该现象在列排序方式为 Automatic 和 Program 方式下均存在
(4) Excel 中不存在该现象(应该与Excel中未使用数据绑定有关)
新进展:
在非绑定模式下,新行总是增加在DataGridView的最后一行,即使已经对数据排序。用户须要在增加新行后再次进行排序,以将新记录放在合适的位置;这种行为方式相似于ListView控件。
在绑定模式或虚拟模式(Virtual Mode)下,假设已对数据排序,那么插入数据时的行为取决于数据模型的实现方式。对于ADO.NET,新加的行会被自己主动排序至合适的位置。
好像没有什么好办法,只能通过先记录要处理的行标识,再循环,直到行标识处理完为止。
你是SQL Server?我也转数据库了
private string strOrderBy=“ 默认排序字段”;
private void OnColumnHeaderMouseClick(DataGridViewCellMouseEventArgs e)
{
try
{
this.Cursor = Cursors.WaitCursor;
System.Threading.Thread.Sleep(50);
if (e.Button == MouseButtons.Left && e.ColumnIndex > -1)
{
String columnName = this.Columns[e.ColumnIndex].Name;
SortOrder so = this.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection;
if (so == SortOrder.Ascending)
{
columnName = columnName + " asc";
}
else if (so == SortOrder.Descending)
{
columnName = columnName + " desc";
}
strOrderBy =" " + columnName;
}
}
catch (Exception ex)
{
throw ex;
}
finally {
this.Cursor = Cursors.Default;
}
}
将局部变量strOrderBy赋值给绑定数据源的ORDER BY 就可以实现无论点击列排序还是系统默认排序,均保持重新绑定后数据顺序不变,应该满足你的预期。
我已经转行不做开发了。
这样处理后,编辑其中的一个单元格,然后焦点离开这个单元格,还会自动排序吗?