DataGridView无法正常排序,请问该如何调整?

有一行序号1-50
但实际排序下来效果是这样的
1
11
12
13
...
2
20
21
..
3
30
31
..
我想要的效果是
1
2
3
4
5
6
7
8
9
10
11
12
13
..

第1个回答  2017-02-13
DataGridView 列有三种排序模式。每一列的排序模式是通过该列的 SortMode 属性指定的,该属性可以设置为以下的 DataGridViewColumnSortMode 枚举值之一。
DataGridViewColumnSortMode 值 说明
Automatic
文本框列的默认排序模式。除非将列标头用于选择,否则单击列标头将自动按此列对 DataGridView 排序,并显示一个指示排序顺序的标志符号。

NotSortable
非文本框列的默认排序模式。可以以编程方式对此列排序;但此列不适合排序,因此未为排序标志符号保留空间。

Programmatic
可以以编程方式对此列排序;而且为排序标志符号保留了空间。
如果默认为 NotSortable 的列包含的值可以有意义地排序,您可能希望更改该列的排序模式。例如,如果有一个数据库列包含表示项状态的数字,则可以通过将一个图像列绑定到该数据库列来将这些数字显示为相应的图标。然后可以在 System.Windows.Forms.DataGridView.CellFormatting 事件的处理程序中,将数值单元格值更改为图像显示值。在这种情况下,将 SortMode 属性设置为 Automatic 会使用户能够对该列排序。自动排序将使用户能够对具有相同状态的项分组,即使这些对应于数字的状态没有自然的顺序。复选框列也是自动排序对于将处于相同状态的项分组很有用的示例。
可以以编程方式按任一列或多列中的值对 DataGridView 排序,而不论 SortMode 设置如何。当希望为排序提供自己的用户界面 (UI) 时,或者当希望实现自定义排序时,以编程方式排序很有用。提供自己的排序用户界面非常有用,例如,在设置 DataGridView 选择模式以启用列标头选择时。在这种情况下,虽然列标头不能用于排序,但是仍希望标头显示相应的排序标志符号,因此将 SortMode 属性设置为 Programmatic。
设置为编程排序模式的列不会自动显示排序标志符号。对于这些列,必须通过设置 System.Windows.Forms.DataGridViewColumnHeaderCell.SortGlyphDirection 属性来手动显示标志符号。为了在自定义排序中能够灵活操作,这是必需的。例如,如果按多列对 DataGridView 排序,则可能希望显示多个排序标志符号或不显示任何标志符号。
虽然可以以编程方式按任一列对 DataGridView 排序,但是一些列(如按钮列)可能不包含可以有意义地排序的值。对于这些列,NotSortable 的 SortMode 属性设置指示将永不使用这些列排序,因此不需要在标头中为标志符号保留空间。
对于已排序的 DataGridView,可以通过检查 SortedColumn 和 SortOrder 属性的值确定排序列和排序顺序。这些值在自定义排序操作之后没有意义。有关自定义排序的更多信息,请参见本主题后面的“自定义排序”部分。
对包含绑定列和未绑定列的 DataGridView 控件排序时,未绑定列中的值无法自动维护。若要维护这些值,必须通过将 VirtualMode 属性设置为 true 和处理 CellValueNeeded 和 CellValuePushed 事件实现虚拟模式。有关更多信息,请参见如何:在 Windows 窗体 DataGridView 控件中实现虚拟模式。在绑定模式下按未绑定列进行排序不受支持。
以编程方式进行排序
可以通过调用 DataGridView 的 Sort 方法以编程方式对其排序。
Sort 方法的 Sort(DataGridViewColumn,ListSortDirection) 重载采用 DataGridViewColumn 和 ListSortDirection 枚举值作为参数。当按列值可以有意义地排序(但不想将该列配置为用于自动排序)的列排序时,此重载很有用。当调用此重载并传入具有 System.Windows.Forms.DataGridViewColumnSortMode.Automatic 的 SortMode 属性值的列时,会自动设置 SortedColumn 和 SortOrder 属性并在列标头中显示相应的排序标志符号。
注意
当通过设置 DataSource 属性将 DataGridView 控件绑定到外部数据源时,Sort(DataGridViewColumn,ListSortDirection) 方法重载不能用于未绑定列。此外,当 VirtualMode 属性为 true 时,可以仅为绑定列调用此重载。若要确定某一列是否为数据绑定列,请检查 IsDataBound 属性值。在绑定模式下对未绑定列排序不受支持。
自定义排序
可以通过使用 Sort 方法的 Sort(IComparer) 重载或通过处理 SortCompare 事件来自定义 DataGridView。
Sort(IComparer) 方法重载采用一个实现 IComparer 接口的类的一个实例作为参数。当希望提供自定义排序时,此重载很有用;例如,当某一列中的值没有自然排序顺序时,或者当自然排序顺序不适用时。在这种情况下,不能使用自动排序,但是可能仍然希望用户通过单击列标头进行排序。可以在 ColumnHeaderMouseClick 事件的处理程序中调用此重载,即使不使用列标头进行选择。
注意
仅当 DataGridView 控件未绑定到外部数据源且 VirtualMode 属性值为 false 时,Sort(IComparer) 方法重载才起作用。若要为绑定到外部数据源的列自定义排序,必须使用由该数据源提供的排序操作。在虚拟模式中,必须为未绑定列提供您自己的排序操作。
若要使用 Sort(IComparer) 方法重载,必须创建您自己的类,该类实现 IComparer 接口。此接口要求您的类实现 System.Collections.IComparer.Compare(System.Object,System.Object) 方法,在调用 Sort(IComparer) 方法重载时,DataGridView 将 DataGridViewRow 对象作为输入传给该方法。使用此方法,您可以基于任一列中的值计算正确的行排序。
Sort(IComparer) 方法重载不设置 SortedColumn 和 SortOrder 属性,因此必须总是设置 System.Windows.Forms.DataGridViewColumnHeaderCell.SortGlyphDirection 属性以显示排序标志符号。
作为 Sort(IComparer) 方法重载的一个替代方法,可以通过为 SortCompare 事件实现处理程序来提供自定义排序。当用户单击为自动排序配置的列的标头时,或者当调用 Sort 方法的 Sort(DataGridViewColumn,ListSortDirection) 重载时,将发生此事件。对控件中的每对行均发生该事件,这使您能够计算它们的正确顺序。
注意
当 DataSource 属性已设置时,或者当 VirtualMode 属性值为 true 时,不会发生 SortCompare 事件。本回答被提问者采纳

datagridview 绑定list列的顺序 乱了
加一句dgv1.AutoGenerateColumns = false; 就行了

VB.NET中DATAGRIDVIEW做排名(要序号)求助!!!
第一种方式:手动设置,设置列允许重新排列,这样在单击datagridview的列名时,就会自动排序 第二种方式:自动排序,想要按那列排序,就设置那列的SortMode的属性为:Programmatic

C# winform datagridview 列顺序的问题?
你使用泛型的时候,是否定义了数据类?如果你定义了数据类,在封装字段后,把你的封装字段的顺序调整成你需要的顺序,绑定的时候就是你要的顺序了 public class ccc { private string id;private string name;public string Id { get { return id; } set { id = value; } } public string Name...

点击DataGridView表头自动排序后,更改的Cell值,过程中DataView行序改变...
_sortOrder = dataGridView1.SortOrder;\/\/ 将目前的SortOrder设置为None来停止排序 dataGridView1.SortOrder = SortOrder.None;\/\/你的更新datagridview的代码填写在这里:\/\/ TODO:\/\/更新完了之后回复SortOrder dataGridView1.SortedColumn = _sortedColumn;dataGridView1.SortOrder = _sortOrder;=== ...

c#控件DataGridView单击列头没有自动排序,为什么?
this.dataGridView1.DataSource = source;} \/\/自定义表头排序 private void dataGridView1_ColumnHeaderMouseClick(object sender,DataGridViewCellMouseEventArgs e){ this.sortfield = dataGridView1.Columns[e.ColumnIndex].Name;source.Sort(compare);this.dataGridView1.Invalidate();} \/\/ 对象 public ...

DataGridView排序事件是哪一个
解决方案1:Automatic.SortMode = DataGridViewColumnSortMode.Columns[XXX];gridViewDataGridView gridView;设置某一列可以自动排序,这样可以实现你的需求么 解决方案2:不行,这个是默认的。如果用非连接模式,dataGridView1.DataSource = ds.Tables["aa"];,点击列头可以排序的,但为何用连接模式绑定,...

c#DataGridView 控件被数据绑定.该控件不能使用比较器来执行排序...
DESC“。此外,对DefaultView的排序会直接引发dgv的重绑定,不需要自己重绑。当然,如果你要实现极为复杂的排序算法,要么在DataTable上直接做,要么自己override DataView的相关方法(UpdateIndex等)并重新继承一个DataTable。最后,如果是绑定到EntitySet,请直接在本地实体集排序,不会有性能问题的。

c#的datagridview控件在点击列标题的时候会把数据自动排序,怎么样把...
DataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;其中i的值就是第几列,从0开始,或设置SortMode 属性的值,在列的属性里

关于VB.net中datagridview控件的排序问题
DataGridView.Sort(this.dataGridViewTextBoxColumn1, ListSortDirection.Descending);降序 DataGridView.Sort(this.dataGridViewTextBoxColumn1, ListSortDirection.Ascending);升序 dataGridViewTextBoxColumn1是列名

怎么把datagridview中的自动排序功能禁用
编辑列-->选定列-->行为-->SortMode-->NotSortable 或者代码里面设置 for (int i = 0; i < this.dataGridView1.Columns.Count; i++) { this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; } ...

相似回答