首页 新闻 会员 周边 捐助

DataGridView 绑定模式下修改内容后自动排序

0
悬赏园豆:50 [待解决问题]


问题描述

绑定数据源的 DataGridView 控件,列排序方式为 Automatic (允许用户点击列表头自动排序)
1. 在点击某列表头排序前,修改该列单元格内容,不会自动排序。这是预期的
2. 在点击某列表头排序后,DataGridView 根据该列自动排序。这是预期的
3. 在点击某列表头排序后修改该列单元格内容,回车或者离开该单元格所属行后,会自动排序。这不是预期的

说明
(1) 该现象只出现在点击列表头进行过排序操作的列
(2) 设置列排序方式为 NotSortable 只禁止了用户通过点击列表头进行排序的操作,无法禁止该列数据变动后自动排序
(3) 该现象在列排序方式为 Automatic 和 Program 方式下均存在
(4) Excel 中不存在该现象(应该与Excel中未使用数据绑定有关)

问题补充:

新进展:

在非绑定模式下,新行总是增加在DataGridView的最后一行,即使已经对数据排序。用户须要在增加新行后再次进行排序,以将新记录放在合适的位置;这种行为方式相似于ListView控件。

在绑定模式或虚拟模式(Virtual Mode)下,假设已对数据排序,那么插入数据时的行为取决于数据模型的实现方式。对于ADO.NET,新加的行会被自己主动排序至合适的位置。

goooogs的主页 goooogs | 初学一级 | 园豆:64
提问于:2014-01-15 15:22
< >
分享
所有回答(2)
0

好像没有什么好办法,只能通过先记录要处理的行标识,再循环,直到行标识处理完为止。

园封记忆 | 园豆:202 (菜鸟二级) | 2015-01-16 15:55

你是SQL Server?我也转数据库了

支持(0) 反对(0) goooogs | 园豆:64 (初学一级) | 2015-01-16 19:21
0

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 就可以实现无论点击列排序还是系统默认排序,均保持重新绑定后数据顺序不变,应该满足你的预期。

C警 | 园豆:202 (菜鸟二级) | 2015-11-16 11:40

我已经转行不做开发了。

 

这样处理后,编辑其中的一个单元格,然后焦点离开这个单元格,还会自动排序吗?

支持(0) 反对(0) goooogs | 园豆:64 (初学一级) | 2015-11-16 12:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册