none
BindingNavigatorで、削除ボタンが押された時に制御を行いたい RRS feed

  • 質問

  • Visual C# 2012
    .NET Framework 4.5

    BindingNavigator、BindingSource、DataGridViewを利用して、グリッドを制御しようと思っています。

    private BindingSource _bindingSourceGrid = new BindingSource();
    
    private void hoge() {
        bindingNavigator1.BindingSource = _bindingSourceGrid;
        dataGridView1.DataSource = bindingNavigator1.BindingSource;
    }

    BindingSourceには、用意したクラスを追加することで、DataGridView上の行追加を行っています。

    BindingNavigatorで、『×』マークで行削除が行えますが、行を削除したタイミングで、対象の行に紐づいているクラスの制御を行いたいのですが、
    削除される前に制御を行う方法はありませんでしょうか?

    DataGridViewのUserDeletingRowイベントは走行しないようで・・・。

    2015年5月20日 1:58

回答

  • 今さらながらで、かつ、回答ではなく質問ですみませんが・・・

    > BindingSourceには、用意したクラスを追加することで、DataGridView上の行追加を行っています。
    > BindingNavigatorで、『×』マークで行削除が行えますが、行を削除したタイミングで、
    > 対象の行に紐づいているクラスの制御を行いたいのですが、
    > 削除される前に制御を行う方法はありませんでしょうか?

    上記で以下の点が矛盾しているように思いますが、説明いただけませんか。

    (1) 「DataGridView上の行追加を行って」いるのに「『×』マークで行削除」という操作をするというのはどういうわけでしょう?

    (2) 「行を削除したタイミング」で「削除される前に」というのはどういうことでしょう?


    上記の点およびアプリの構成が不明なのでハズレかもしれませんが・・・

    上の矛盾点はちょっと置いといて、『×』マークをクリックしたタイミングで「削除される前に制御」という処置を行えば良いのであれば、『×』マークに該当する ToolStripButton(ですよね?)の Click イベントのハンドラに処置を実装できると思うのですが。

    具体的には、Visual Studio のデザイン画面で『×』マークを選択し、プロパティウィンドウでイベント一覧を表示(雷マークのアイコンをクリック)、一覧の中の Click をダブルクリックすると空のイベントハンドラのコードが自動生成されるはずですが、それに例えば(あくまで例えばです)以下のようなコードを実装するということです。

    private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
    {
        // ここに「削除される前に制御」のコードを実装
    
        this.customersBindingSource.RemoveCurrent();
    
        int count = this.customersBindingSource.Count;
    
        // 途中から消していった場合これが必要
        if (this.customersBindingSource.Position == count - 1)
        {
            this.bindingNavigatorMoveNextItem.Enabled = false;
            this.bindingNavigatorMoveLastItem.Enabled = false;
        }
    
        if (count <= 1)
        {
            this.bindingNavigatorMoveFirstItem.Enabled = false;
            this.bindingNavigatorMovePreviousItem.Enabled = false;
            this.bindingNavigatorMoveNextItem.Enabled = false;
            this.bindingNavigatorMoveLastItem.Enabled = false;
        }
    
        if (count == 0)
            this.bindingNavigatorDeleteItem.Enabled = false;
    
    }



    • 編集済み SurferOnWww 2015年5月21日 3:36 誤記訂正
    • 回答としてマーク takiru 2017年12月15日 5:58
    2015年5月21日 3:34

すべての返信

  • BindingSource::ListChangedイベントはいかがでしょうか?
    2015年5月20日 2:00
  • 削除する前に「削除確認」もあった方が良いと思いますので、以下のようにBindingNavigatorを拡張されてみてはいかがでしょうか? その結果、お求めになっている答えも自然に見つかるように思います。

    Visual Studio 2005のフォームにおけるBindingNavigatorの拡張
    http://internetcom.jp/developer/20060627/26.html


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年5月20日 2:14
    モデレータ
  • コードが断片的で、残念ながらよく理解できませんでした・・・。
    2015年5月20日 7:59
  • BindingNavigatorの拡張を紹介しましたが、そこまでやるならBindingNavigatorを使わないというのも手です。つまり、BindingNavigatorは簡単なアプリケーションを簡単に作るためのものと割り切るということです。それでもBindingNavigatorを使用され、用意されている機能から逸脱して今回のご質問のようなことをされるのであれば、いずれはBindingNavigatorの拡張ということになるでしょう。
    ただ、今回の件に限っては、Hongliangさんが書かれているようにListChangedイベントハンドラで対応できるかもしれません。しかし、もし、データベース等を扱っておられるのであれば、トランザクションを切らない場合、データーの不整合が発生する可能性があります。
    大幅な方向転換になるかもしれませんが、BindingNavigatorを使わない実装も検討されることをお勧めします。BindingNavigatorを拡張して実装するよりもわかりやすく、より実用的になるように思います。その結果として、全体的な苦労は減るのではないかと思います。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年5月21日 2:47
    モデレータ
  • 今さらながらで、かつ、回答ではなく質問ですみませんが・・・

    > BindingSourceには、用意したクラスを追加することで、DataGridView上の行追加を行っています。
    > BindingNavigatorで、『×』マークで行削除が行えますが、行を削除したタイミングで、
    > 対象の行に紐づいているクラスの制御を行いたいのですが、
    > 削除される前に制御を行う方法はありませんでしょうか?

    上記で以下の点が矛盾しているように思いますが、説明いただけませんか。

    (1) 「DataGridView上の行追加を行って」いるのに「『×』マークで行削除」という操作をするというのはどういうわけでしょう?

    (2) 「行を削除したタイミング」で「削除される前に」というのはどういうことでしょう?


    上記の点およびアプリの構成が不明なのでハズレかもしれませんが・・・

    上の矛盾点はちょっと置いといて、『×』マークをクリックしたタイミングで「削除される前に制御」という処置を行えば良いのであれば、『×』マークに該当する ToolStripButton(ですよね?)の Click イベントのハンドラに処置を実装できると思うのですが。

    具体的には、Visual Studio のデザイン画面で『×』マークを選択し、プロパティウィンドウでイベント一覧を表示(雷マークのアイコンをクリック)、一覧の中の Click をダブルクリックすると空のイベントハンドラのコードが自動生成されるはずですが、それに例えば(あくまで例えばです)以下のようなコードを実装するということです。

    private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
    {
        // ここに「削除される前に制御」のコードを実装
    
        this.customersBindingSource.RemoveCurrent();
    
        int count = this.customersBindingSource.Count;
    
        // 途中から消していった場合これが必要
        if (this.customersBindingSource.Position == count - 1)
        {
            this.bindingNavigatorMoveNextItem.Enabled = false;
            this.bindingNavigatorMoveLastItem.Enabled = false;
        }
    
        if (count <= 1)
        {
            this.bindingNavigatorMoveFirstItem.Enabled = false;
            this.bindingNavigatorMovePreviousItem.Enabled = false;
            this.bindingNavigatorMoveNextItem.Enabled = false;
            this.bindingNavigatorMoveLastItem.Enabled = false;
        }
    
        if (count == 0)
            this.bindingNavigatorDeleteItem.Enabled = false;
    
    }



    • 編集済み SurferOnWww 2015年5月21日 3:36 誤記訂正
    • 回答としてマーク takiru 2017年12月15日 5:58
    2015年5月21日 3:34
  • 【追伸】

    一つ忘れてました。

    ToolStripButton の Click イベントのハンドラの設定だけではダメで、それを保持する BindingNavigator のプロパティの設定も必要でした。

    先の私のレスで紹介した方法に興味があって、設定方法等を知りたい場合はその旨連絡ください。

    2015年5月21日 9:05