まず、オブジェクトを にバインドしたとしても、DataTableオブジェクトは から切り離されます。つまり、変更しても には影響しません。そしてあなたの場合、ソートをに反映させたいと思っています。そのため、 での順序付け/並べ替えに変更があるたびに、イベントをキャッチする必要があります。したがって、そのためには、のイベントをキャッチする必要があります。DataGridViewDataSourceDataGridViewDataTableDataGridViewDataTableDataGridViewColumnHeaderMouseClickDataGridView
もうひとつ重要なことは、両方の同期ソートを実現する上でDataTable、プロパティを持つクラスDataGridViewのDefaultViewメソッドです。そのため、ソートに関して が変更されるたびに、 もソートします。DatableSortDataGridViewDataTable
最初に、後でどこからでもアクセスできるように、DataTable オブジェクトをグローバルにする必要があります。
DataTable table;
次に、イベントリスナーを初期化する必要がありColumnHeaderMouseClick、実用的な目的のためにFormコンストラクターで設定します。
InitializeComponent();
dataGridView1.ColumnHeaderMouseClick += new DataGridViewCellMouseEventHandler(dataGridView1_ColumnHeaderMouseClick);
次に、この空の Mouse イベント ハンドラーを作成します。
void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
}
上記の方法が自動的に出てこない場合は、コードをコピーして貼り付けてください。
DataTable説明のために、 duringを追加しForm Loadます。この場合、独自のコードを使用します。
table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("Age", typeof(int));
table.Rows.Add("Alex", 27);
table.Rows.Add("Jack", 65);
table.Rows.Add("Bill", 22);
dataGridView1.DataSource = table;
最後に、ColumnHeaderMouseClickイベントにいくつかのコードを追加します。
void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (dataGridView1.SortOrder.ToString() == "Descending") // Check if sorting is Descending
{
table.DefaultView.Sort = dataGridView1.SortedColumn.Name + " DESC"; // Get Sorted Column name and sort it in Descending order
}
else
{
table.DefaultView.Sort = dataGridView1.SortedColumn.Name + " ASC"; // Otherwise sort it in Ascending order
}
table = table.DefaultView.ToTable(); // The Sorted View converted to DataTable and then assigned to table object.
}
テーブル オブジェクトを使用して、の並べ替え順序に従って並べ替えることができるようになりましたDataGridView。
私の主張を確認するために、名前の付いたフォームにボタンを作成し、button1クリックすると、次のように最初の行と並べ替えられた列の値が表示されます。
private void button1_Click(object sender, EventArgs e)
{
String sortedValue = dataGridView1.SortedColumn.Name == "Name" : table.Rows[0][0].ToString() ? table.Rows[0][1].ToString();
MessageBox.Show(sortedValue);
}