C# 自定义排序顺序-DataGridView
是否可以在datagridview中对此进行排序,而不将数据填充到+后面的3个值。C# 自定义排序顺序-DataGridView,c#,winforms,datagridview,datatable,C#,Winforms,Datagridview,Datatable,是否可以在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 DGV.SortCompare += new DataGridViewSortCompareEventHandler( this.DGV_SortCompare); 也许将排序模式
数据类型为字符串,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
DGV.SortCompare += new DataGridViewSortCompareEventHandler( this.DGV_SortCompare);
也许将排序模式更改为编程模式会有所帮助
如有任何意见,将不胜感激
编辑:将数据复制到dt然后绑定到dataview的示例
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做好准备:
首先,您需要连接一个SortCompare
处理程序,可能是这样
10:10+01
10:10+10
10:10+100
10:10+110
DGV.SortCompare += new DataGridViewSortCompareEventHandler( this.DGV_SortCompare);
如有必要,您可以在列中调用它(或让标题单击“执行任务”):
这是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;
}
对DGV排序的三种方法进行了全面讨论-显然,这是解决您的问题最简单的方法。也非常灵活:您可以使用e.columnIndex
参数为其他列创建sperate比较字符串
如果其他列不需要特殊的排序代码,则应将此行插入SortCompare
:
if (e.Column.Index != yourColumn) return;
数据绑定DataGridView的自定义排序
更新:由于您已将问题更改为数据绑定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;
}
此解决方案假定您的数据源
是一个数据表DT
,并将创建一个名为“TempSort”的临时列,并用准备好的数据值版本填充它;它将按升序排序
对于排序,我们使用BindingSource
要动态控制右列(此处称为“yourcolumn
”)以及排序顺序,您必须自己编写一些代码,响应ColumnHeaderClick
。创建一个列,修改数据以使用正常排序,或者,是的,更改为编程。听起来比实际情况更难。据我记忆所及,只有1-3个函数。您的数据已更改,但下面的解决方案将在扩展填充后起作用。但是您之前没有提到DGV是数据绑定的!感谢您输入TaW和示例。我用示例数据编辑了我的文章。我已经添加了SortCompare事件,但当我单击列标题时,它似乎没有触发。我已经添加了事件,并使用“dataGridView1.sort(dataGridView1.Columns[0],ListSortDirection.Ascending)”强制进行排序,但仍然没有触发DGV_SortCompare