Я искал пример сортировки 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";
}
}
}