まず、オブジェクトを にバインドしたとしても、DataTable
オブジェクトは から切り離されます。つまり、変更しても には影響しません。そしてあなたの場合、ソートをに反映させたいと思っています。そのため、 での順序付け/並べ替えに変更があるたびに、イベントをキャッチする必要があります。したがって、そのためには、のイベントをキャッチする必要があります。DataGridView
DataSource
DataGridView
DataTable
DataGridView
DataTable
DataGridView
ColumnHeaderMouseClick
DataGridView
もうひとつ重要なことは、両方の同期ソートを実現する上でDataTable
、プロパティを持つクラスDataGridView
のDefaultView
メソッドです。そのため、ソートに関して が変更されるたびに、 もソートします。Datable
Sort
DataGridView
DataTable
最初に、後でどこからでもアクセスできるように、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);
}