Сортировка DataGridView по нескольким столбцам?

Я искал пример сортировки DataGridView по нескольким столбцам, но, похоже, не могу найти пример, который делает то, что мне нужно.

По сути, у меня есть связанный элемент управления DataGridView (привязанный к DataTable / DataView), а связанный DataTable имеет два столбца: - приоритет и дата. Я хотел бы сортировать по дате в пределах приоритета. То есть столбец приоритета имеет приоритет. , то это дата, но оба могут быть восходящими или нисходящими.

Так, например, У меня может быть низкий приоритет, сначала ранняя дата (порядок по возрастанию приоритета, дата по возрастанию) , и, щелкнув заголовок столбца даты, переключиться на низкий приоритет, сначала поздняя дата (порядок по приоритету по возрастанию , дата по убыванию) . Если я затем нажму на приоритет, я хотел бы сначала иметь высокий приоритет, а затем позднюю дату (текущий порядок сортировки для столбца даты - порядок по приоритету по убыванию, дата по убыванию) , но затем я смогу щелкните заголовок столбца даты, чтобы переключиться на высокий приоритет, раннюю дату (порядок по приоритету по убыванию, дата по возрастанию) .

В идеале, я бы хотел, чтобы глифы сортировки в обоих столбцах отображались по возрастанию или убыванию.

Любые идеи или указатели будут с благодарностью приняты.

Это (см. Ниже) кажется довольно близким, но глифы работают неправильно.

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication4
{
  public partial class Form1 : Form
  {
     DataSet1 dataset;

     public Form1()
     {
        InitializeComponent();

        dataset = new DataSet1(); // two columns: Priority(Int32) and date (DateTime)
        dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("01-jan-10"));
        dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("02-jan-10"));
        dataset.DataTable1.AddDataTable1Row(1, DateTime.Parse("03-jan-10"));
        dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("04-jan-10"));
        dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("05-jan-10"));
        dataset.DataTable1.AddDataTable1Row(2, DateTime.Parse("06-jan-10"));
        dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("07-jan-10"));
        dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("08-jan-10"));
        dataset.DataTable1.AddDataTable1Row(3, DateTime.Parse("09-jan-10"));

        dataGridView1.DataSource = dataset.DataTable1.DefaultView;

        dataGridView1.AllowUserToAddRows = false;

        dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.Programmatic;
        dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.Programmatic;

        dataGridView1.Columns[0].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
        dataGridView1.Columns[1].HeaderCell.SortGlyphDirection = SortOrder.Ascending;
     }

     private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
     {
        DataGridViewColumn[] column = new[] { dataGridView1.Columns[0], dataGridView1.Columns[1] };

        DataGridViewColumnHeaderCell headerCell = dataGridView1.Columns[e.ColumnIndex].HeaderCell;

        if (headerCell.SortGlyphDirection != SortOrder.Ascending)
           headerCell.SortGlyphDirection = SortOrder.Ascending;
        else
           headerCell.SortGlyphDirection = SortOrder.Descending;

        String sort = column[0].DataPropertyName + " " + fnSortDirection(column[0])
                    + ", "
                    + column[1].DataPropertyName + " " + fnSortDirection(column[1]);
        dataset.DataTable1.DefaultView.Sort = sort;
        this.textBox1.Text = sort;
     }

     private String fnSortDirection(DataGridViewColumn column)
     {
        return column.HeaderCell.SortGlyphDirection != SortOrder.Descending ? "asc" : "desc";
     }
  }
}
8
задан Black Light 10 January 2011 в 13:24
поделиться