none
ComboboxのDataSourceバインド時のイベントについて RRS feed

  • 質問

  • 現在、Visual Studio 2008 C#を利用して、プログラムを作成しております。

     

    Comboboxに限ったことではないと思いますが、DataSourceにデータがバインドされるごとに、

    SelectedValueChangedやSelectedIndexChangedのイベントが呼ばれます。

     

    1.バインド時に、イベントを解除しバインド後、再びイベントを付与

    2.フラグを利用してイベントの実行を制御

     

    の、2点で対策を打っておりますが、他に何か良い方法とうはございますでしょうか?

    2008年10月22日 14:05

回答

  •  

    DataSourceにバインドされるときにフラグ制御をしてくれるようにしたComboBoxを作って手間を省くくらいしか思いつかないですね。

     

    Code Snippet

    public class ComboBoxNotSelectEvent : ComboBox
    {
        private bool isDataSourceChanging  = false;

        protected override void OnDataSourceChanged(System.EventArgs e )
        {
            isDataSourceChanging = true;
            base.OnDataSourceChanged(e);
            isDataSourceChanging = false;
        }
        protected override void OnDisplayMemberChanged(System.EventArgs e)
        {
            isDataSourceChanging = true;
            base.OnDisplayMemberChanged(e);
            isDataSourceChanging = false;
        }

        protected override void OnSelectedIndexChanged(System.EventArgs e)
        {
            if( ! isDataSourceChanging)
            {
                base.OnSelectedIndexChanged(e);
            }

        }

        protected override void OnSelectedValueChanged(System.EventArgs e)
        {
           if( ! isDataSourceChanging)
           {
               base.OnSelectedValueChanged(e);
           }
        }
    }

     

     

     

    2008年10月24日 11:56

すべての返信

  • ComboBox でユーザが変更したときだけ通知を受けたいのであれば、SelectionChangeCommitted イベントを拾うのはどうでしょうか。

     

    2008年10月23日 7:36
  • こんにちは!(^^)!ふ~です。

     

    Form1.Designer.csの中を覗きますと、   this.SuspendLayout()を実行し、コントロールの状態を停止してから、設定を変更し、作業後に、this.ResumeLayout(false)を実行し、再開しています。この辺をご利用されては如何でしょうか?

    2008年10月23日 7:43
  •  !(^^)!ふ~ さんからの引用

    Form1.Designer.csの中を覗きますと、   this.SuspendLayout()を実行し、コントロールの状態を停止してから、設定を変更し、作業後に、this.ResumeLayout(false)を実行し、再開しています。この辺をご利用されては如何でしょうか?

     

    そうなのですか?

     

    SuspendLayout メソッド、ResumeLayout メソッドはレイアウト ロジックを停止するだけなので、
    レイアウトに関係のない ComboBox のイベントは影響しないと思っていましたが...

     

    こりゃ私の勉強不足ですね。

    2008年10月23日 8:48
  • こんにちは!(^^)!ふ~です。

     

    >こりゃ私の勉強不足ですね。

    あははー、思い出しました。イベントは確かに発生します。1年程前に、なぜかなぁと悩んでいました。

    このイベントの発生を抑える事は出来なかった記憶が有ります。イベントの種類で対応する方法が良いのですね。

    私も、どうしても使う場合は、if文で、初期化の場合だけ、returnで処理を抜けていました。

    じゃんぬねっとさん、どうもありがとうございました。

     

     

    2008年10月23日 9:14
  •  

    DataSourceにバインドされるときにフラグ制御をしてくれるようにしたComboBoxを作って手間を省くくらいしか思いつかないですね。

     

    Code Snippet

    public class ComboBoxNotSelectEvent : ComboBox
    {
        private bool isDataSourceChanging  = false;

        protected override void OnDataSourceChanged(System.EventArgs e )
        {
            isDataSourceChanging = true;
            base.OnDataSourceChanged(e);
            isDataSourceChanging = false;
        }
        protected override void OnDisplayMemberChanged(System.EventArgs e)
        {
            isDataSourceChanging = true;
            base.OnDisplayMemberChanged(e);
            isDataSourceChanging = false;
        }

        protected override void OnSelectedIndexChanged(System.EventArgs e)
        {
            if( ! isDataSourceChanging)
            {
                base.OnSelectedIndexChanged(e);
            }

        }

        protected override void OnSelectedValueChanged(System.EventArgs e)
        {
           if( ! isDataSourceChanging)
           {
               base.OnSelectedValueChanged(e);
           }
        }
    }

     

     

     

    2008年10月24日 11:56