DataTableをバインドしたDataGridViewのソートをしたかったものの、
検索に引っかからなかったのでメモ。
とりあえずは列のソートのみでサンプルを作成。
キモとしてはDataViewをIBindingListにキャストして、
SortProperty、SortDirectionプロパティを取得及び設定するところ。
デフォルトはSortPropertyはnull、SortDirectionはAscendingとする。
取得を行うためのソート前のイベントとして適当なものが無かったため、
あくまでもソートをするためにはヘッダーセルをクリックする前提で
CellMouseEnterイベントを使用した。
まずは当該イベントにて、
SortProperty、SortDirectionプロパティよりソート前の値を取得する。
あくまでもソートする候補として都度取得を行うのみとし、
ソート後にソート前の値として使用する。
その後、ソート後のイベントではSortProperty、SortDirectionプロパティより
ソート後の値を取得し、コマンドを作成する。
コマンドの作成は検索してすぐに見つかると思われるので、省略。
ソート前の列とソート後の列が一緒かどうかの検証を行うべきかと思われるが、
上記のとおり、ヘッダーセルをクリックする前提であれば、問題なく動作している模様。
PropertyDescriptor prevSortProperty_; // ソート前のソートプロパティ
ListSortDirection prevSortDirection_; // ソート前のソート方向
void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)
{
// 列ヘッダーセルにマウスが入った場合のみ、
// 各プロパティの値を取得
if(e.RowIndex == -1)
{
IBindingList bindingList =
(IBindingList)this.dataGridView1.DataSource.DefaultView;
prevSortProperty_ = bindingList.SortProperty;
prevSortDirection_ = bindingList.SortDirection;
}
}
void dataGridView1_Sorted(object sender, EventArgs e)
{
// ソート後のソートプロパティとソート方向を取得
IBindingList bindingList =
(IBindingList)this.dataGridView1.DataSource.DefaultView;
PropertyDescriptor currentSortProperty = bindingList.SortProperty;
ListSortDirection currentSotrDirection = bindingList.SortDirection;
// prevSortProperty_、prevSortDirection_、
// currentSortProperty、currentSotrDirectionを使用して、
// ソートのアンドゥー・リドゥーコマンドを作成
}