2015年4月19日日曜日

【C#】DataTableをバインドしたDataGridViewのソートをアンドゥー・リドゥーする


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を使用して、
    // ソートのアンドゥー・リドゥーコマンドを作成
}

0 件のコメント:

コメントを投稿