自定义排序顺序 – 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
…