如何按2列对datagridview进行排序

use*_*847 12 c# datagridview winforms

如何按两列(升序)对DataGridView进行排序?我有两列:daystatus.

如果我需要按一列排序,我会:

this.dataGridView1.Sort (this.dataGridView1.Columns["day"], ListSortDirection.Ascending);
Run Code Online (Sandbox Code Playgroud)

但对于两个?

VS1*_*VS1 10

如果您DataGridView是数据绑定,则可以对Datatable视图进行排序并重新绑定到数据表,如下所示:

private DataGridView dataGridView1 = new DataGridView();
private BindingSource bindingSource1 = new BindingSource();

private void Form1_Load(object sender, System.EventArgs e)
{
    // Bind the DataGridView to the BindingSource        
    dataGridView1.DataSource = bindingSource1;
    SortDataByMultiColumns(); //Sort the Data
}

private void SortDataByMultiColumns()
{
    DataView view = dataTable1.DefaultView;
    view.Sort = "day ASC, status DESC"; 
    bindingSource1.DataSource = view; //rebind the data source
}
Run Code Online (Sandbox Code Playgroud)

或者,不使用bindingsource并直接绑定到DataView:

private void SortDataByMultiColumns()
{
    DataView view = ds.Tables[0].DefaultView;
    view.Sort = "day ASC, status DESC"; 
    dataGridView1.DataSource = view; //rebind the data source
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*rtz 7

您可以使用 DataGridView 的 Sort 方法,但指定一个参数,该参数是实现 IComparer 的类的实例。

下面是一个这样的类的例子:

public class MyTwoColumnComparer : System.Collections.IComparer
{
    private string _SortColumnName1;
    private int _SortOrderMultiplier1;
    private string _SortColumnName2;
    private int _SortOrderMultiplier2;

    public MyTwoColumnComparer(string pSortColumnName1, SortOrder pSortOrder1, string pSortColumnName2, SortOrder pSortOrder2)
    {
        _SortColumnName1 = pSortColumnName1;
        _SortOrderMultiplier1 = (pSortOrder1 == SortOrder.Ascending) ? 1 : -1;
        _SortColumnName2 = pSortColumnName2;
        _SortOrderMultiplier2 = (pSortOrder2 == SortOrder.Ascending) ? 1 : -1;
    }

    public int Compare(object x, object y)
    {
        DataGridViewRow r1 = (DataGridViewRow)x;
        DataGridViewRow r2 = (DataGridViewRow)y;

        int iCompareResult = _SortOrderMultiplier1 * String.Compare(r1.Cells[_SortColumnName1].Value.ToString(), r2.Cells[_SortColumnName1].Value.ToString());
        if (iCompareResult == 0) iCompareResult = _SortOrderMultiplier2 * String.Compare(r1.Cells[_SortColumnName2].Value.ToString(), r2.Cells[_SortColumnName2].Value.ToString());
        return iCompareResult;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我们可以在单击鼠标时从 SortMode 为“程序化”的列中调用它:

private void dgvAllMyEmployees_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    DataGridViewColumn dgvcClicked = dgvAllEmployees.Columns[e.ColumnIndex];
    if (dgvcClicked.SortMode == DataGridViewColumnSortMode.Programmatic)
    {
        _SortOrder = (_SortOrder == SortOrder.Ascending) ? SortOrder.Descending : SortOrder.Ascending;
        MyTwoColumnComparer Sort2C = new MyTwoColumnComparer(dgvcClicked.Name, _SortOrder, "LastName", SortOrder.Ascending);
        dgvAllEmployees.Sort(Sort2C);
    }
}
Run Code Online (Sandbox Code Playgroud)

类级别变量 _SortOrder 有助于跟踪进入的顺序。可以进一步增强这一点,以记住单击的最后两列并按所需顺序对它们进行排序。


lin*_*rro 6

添加一个隐藏列,它将两者结合起来并按其排序.

  • 这是一个好主意,但如果您想对一列 asc 和另一列 desc 进行排序,则行不通。 (2认同)

sus*_*oo_ 6

TLDR; 我有一个双线解决方案.

我必须做同样的事情,但在通过包括一个单独的.dll或编写我自己的类/方法来研究所有这些复杂的方法之后,我知道必须有一个更简单的方法.事实证明我是对的,因为我想通过仅使用两行代码来实现这一目标.这对我有用.

幸运的是,对我们来说,.NET Framework Sort()方法确实帮助了我们.这个想法是你想要单独对列进行排序,但是你对它们进行排序的顺序是产生所需输出的顺序.

因此,作为示例,我有一个文件类型列和一个文件名列.每当我想按类型对数据进行排序时,我想确保名称也在显示的每种类型中排序.

目标:按类型排序还将按字母顺序对文件名进行排序.

数据:

zxcv.css

testimg3.jpg

asdf.html

testimg2.jpg

testimg1.jpg

按名称排序数据:

mConflictsDataGridView.Sort(mConflictsDataGridView.Columns[mNameLabel.Index], ListSortDirection.Ascending);
Run Code Online (Sandbox Code Playgroud)

asdf.html

testimg1.jpg

testimg2.jpg

testimg3.jpg

zxcv.css

正如您所看到的,这将确定名称将相应地进行排序,这样当我现在按文件类型排序时,两个要求都将满足.

按文件类型排序数据:

mConflictsDataGridView.Sort(mConflictsDataGridView.Columns[mFileExtensionLabel.Index], ListSortDirection.Ascending);
Run Code Online (Sandbox Code Playgroud)

zxcv.css

asdf.html

testimg1.jpg

testimg2.jpg

testimg3.jpg

瞧!它排序了!

解决方案:在您的情况下,您可能想尝试类似下面的内容,您可能需要进一步调整它以满足您自己的代码.

DataGridView1.Sort(DataGridView1.Columns["status"], ListSortDirection.Ascending);
DataGridView1.Sort(DataGridView1.Columns["day"], ListSortDirection.Asscending);
Run Code Online (Sandbox Code Playgroud)

这应该能够在一天之前显示您的结果,并且其状态字段也会被排序.