C# 自定义排序顺序-DataGridView

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中对此进行排序,而不将数据填充到+后面的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);
也许将排序模式更改为编程模式会有所帮助

如有任何意见,将不胜感激

编辑:将数据复制到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