Szukałem przykładu sortowania DataGridView na wielu kolumnach, ale nie mogę znaleźć przykładu, który robi to, co chciałbym.Sortowanie DataGridView na wielu kolumnach?
Zasadniczo posiadam powiązaną kontrolkę DataGridView (powiązaną z DataTable/DataView), a związana DataTable ma dwie kolumny: - priorytet i datę. Chciałbym sortować według daty w ramach priorytetu. Oznacza to, że kolumna priorytetu ma pierwszeństwo, a następnie datę, ale obie mogą być rosnące lub malejące.
Tak więc, na przykład, może mam niski priorytet, wczesna data pierwszego (kolejność według priorytetu ASC data ASC), a klikając nagłówek data kolumny, przełącznik niskiego priorytetu, późna data pierwszej (kolejność według priorytetu asc, data desc). Jeśli następnie kliknę na priorytet, chciałbym najpierw mieć wysoki priorytet, a następnie późną datę (aktualny porządek sortowania dla kolumny daty - zamówienie według priorytetu desc, data desc), ale wtedy można kliknąć kolumnę daty nagłówek, aby przełączyć na wysoki priorytet, wczesną datę (kolejność według wzorca pierwszeństwa, daty asc).
Idealnie chciałbym posortować glify w obu kolumnach, aby pokazać rosnąco lub malejąco.
Wszelkie pomysły i wskazówki zostaną z wdzięcznością przyjęte.
Ten (patrz poniżej) wydaje się być bardzo blisko, ale glify nie działają poprawnie.
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";
}
}
}
Co masz na myśli przez „prawo nie działa” w odniesieniu do glifów strzałek? Naprawdę nie chciałem poświęcać czasu na napisanie kodu do sortowania, ale dostałem to, aby wyglądało to wcześniej, i wygląda na to, że jesteś teraz na najlepszej drodze. –
Cóż ... Glif dla pierwszej kolumny (priorytet) przełącza się pomiędzy górą a dół, ale glif dla drugiej kolumny wydaje się być czymś w rodzaju trzech stanów i wyświetla jako górny, nic, nic. Zgaduję, że DGV tak naprawdę nie lubi posiadania dwóch glifów sortujących w tym samym czasie? Dodałem trzecią kolumnę z "normalnym" sortowaniem i wydaje mi się to w porządku, ale (z glyfami na pierwszych dwóch kolumnach znikających), ale kliknięcie nagłówka drugiej kolumny daje mi wznoszący się glif w pierwszej kolumnie. –
Google dla 'MultisortDataGridView' IIRC. – leppie