自定义排序顺序 – DataGridView

是否可以在datagridview中对此进行排序,而无需在+之后将数据填充为3个值。
数据类型是字符串,datagridview列是文本。

10:10+01 10:10+100 10:10+110 10:10+10 

应该这样排序

  10:10+01 10:10+10 10:10+100 10:10+110 

也许将排序模式改为程序化可能会有所帮助?

任何输入将不胜感激

编辑:复制到dt然后绑定到数据视图的数据示例。

 DataTable dtTest = new DataTable(); dtTest.Columns.Add("Column1", typeof(string)); dtTest.Rows.Add("10:11+1"); dtTest.Rows.Add("10:11+101"); dtTest.Rows.Add("10:11+101"); dtTest.Rows.Add("10:11+2"); dtTest.Rows.Add("10:11+200"); dtTest.Rows.Add("10:10+1110"); DataView dvTest = new DataView(dtTest); dataGridView1.DataSource = dvTest; 

示例排序顺序

 10:10+1110 10:11+1 10:11+101 10:11+101 10:11+2 10:11+200 

自定义排序未绑定的DataGridview

不确定您的数据,但从字面上DataGridView DGV这将为未绑定的 DataGridView DGV

首先,您需要连接一个SortCompare处理程序,可能就像这样

  DGV.SortCompare += new DataGridViewSortCompareEventHandler( this.DGV_SortCompare); 

如有必要,您可以在列上调用它(或让Header点击执行该作业):

  DGV.Sort(DGV.Columns[yourColumn], ListSortDirection.Ascending); 

这是SortCompare事件代码。 它使用简单的字符串操作来创建可排序的版本,方法是用零填充最后一部分。

  private void DGV_SortCompare(object sender, DataGridViewSortCompareEventArgs e) { string s1 = e.CellValue1.ToString().Substring(0, 6) + e.CellValue1.ToString().Substring(6).PadLeft(5, '0'); string s2 = e.CellValue2.ToString().Substring(0, 6) + e.CellValue2.ToString().Substring(6).PadLeft(5, '0'); e.SortResult = s1.CompareTo(s2); e.Handled = true; } 

有关在MSDN上对DGV进行排序的三种方法的全面讨论。 – 显然这是最容易解决问题的方法。 同样相当灵活:您可以使用e.columnIndex参数为其他列创建e.columnIndex比较字符串。

如果其他列不需要特殊的排序代码,则应将此行插入SortCompare的开头:

  if (e.Column.Index != yourColumn) return; 

自定义排序数据绑定DataGridView

更新:由于您已将问题更改为DataBound DGV ,因此以下是此案例的类似解决方案:

 BindingSource BS = new BindingSource(); private void sortButton_Click(object sender, EventArgs e) { DT.Columns.Add("TempSort"); foreach (DataRow row in DT.Rows) { string val = row[yourcolumn].ToString(); row["TempSort"] = val.ToString().Substring(0, 6) + val.ToString().Substring(6).PadLeft(5, '0'); } BS.DataSource = DT; BS.Sort = "TempSort ASC"; DT.Columns.Remove("TempSort"); DGV.DataSource = BS; } 

此解决方案假设您的DataSource是一个DataTable DT ,并将创建一个名为“TempSort”的临时列,并使用准备好的数据值填充它; 它将升序排序。

对于排序,我们使用BindingSource

要动态控制右列(此处称为“ yourcolumn ”)以及排序顺序,您必须自己编写一些代码,以响应ColumnHeaderClick