我在Win Forms应用程序中有一个数据绑定的DataGridView,用户可能会按列排序。问题是:用户在编辑已排序列中的单元格并离开行后,该行立即重新排序。
这对用户来说非常令人迷惑,使得一起编辑多行变得不可能。
我正在寻找的解决方案将有效地禁用初始排序后的自动重新排序,只有在用户请求时才会重新排序。
我在Win Forms应用程序中有一个数据绑定的DataGridView,用户可能会按列排序。问题是:用户在编辑已排序列中的单元格并离开行后,该行立即重新排序。
这对用户来说非常令人迷惑,使得一起编辑多行变得不可能。
我正在寻找的解决方案将有效地禁用初始排序后的自动重新排序,只有在用户请求时才会重新排序。
private void MyDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
dirtyCellListenerEnabled = false;
SORT_ORDER.ValueType = MyDataGridView.Columns[e.ColumnIndex].ValueType;
foreach(DataGridViewRow r in MyDataGridView.Rows) {
r.Cells[SORT_ORDER.Index].Value = r.Cells[e.ColumnIndex].Value;
}
switch(MyDataGridView.SortOrder) {
case System.Windows.Forms.SortOrder.None:
MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending);
break;
case System.Windows.Forms.SortOrder.Ascending:
MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Descending);
break;
case System.Windows.Forms.SortOrder.Descending:
MyDataGridView.Sort(SORT_ORDER, ListSortDirection.Ascending);
break;
}
dirtyCellListenerEnabled = true;
}
我现在深刻地感受到这是一种真正的痛苦。有时候,网格看起来非常复杂,但实际上并没有什么意义。
对于每个选定的单元格,我都会存储主键和网格列的名称(我创建了一个小类来保存它们)。
然后,我将它们全部放入列表中,并遍历它们进行更新。每次更新单元格值时,我会搜索实际单元格的位置,并替换我的本地引用变量以便我可以继续在代码中进行。
Cell.Value = ValueToWrite
Cell = FindCell(Cell.OwningRow.DataGridView, DataRow, ColName)
Function FindCell(Grid As DataGridView, DataRow As DataRow, ColName As String) As DataGridViewCell
'Find the same cell, wherever you may be now, damn you sort.
Dim GridRow = (From x As DataGridViewRow In Grid.Rows Where x.DataBoundItem.row Is DataRow).FirstOrDefault
Dim Cell = GridRow.Cells(ColName)
Return Cell
End Function
我遇到了这个问题,但是找不到一个合适的答案,所以我尝试了一下,结果成功了。
private void SortBoundDG()
{
DataTable TempTable;
TempTable = (DataTable)DG.DataSource;
TempTable.DefaultView.Sort = ColumnName + " " + "DESC";
DG.DataSource = TempTable.DefaultView.ToTable();
}
只需将默认视图简单地转换回表格,并将其设置为您的DataGridView的数据源
看起来你的GridView正在重新绑定数据。这意味着你的排序顺序将会丢失。启用你的gridview的Viewstate,并确保你没有在postback时重新绑定grid。