2

特定のイベントが呼び出される順序を変更することはできますか? たとえば、ComboBox があり、選択が変更されたときに、TextChanged イベントが呼び出される前に SelectedIndexChanged イベントが呼び出されるようにします。私の正直な意見は、SelectedIndexChanged イベントの前に TextChanged イベントを呼び出すのはかなりばかげているということです。

どんな助けでも大歓迎です。

4

3 に答える 3

3

いいえ、順序を変更することはできません。制御コードにハード コードされています。

// from http://referencesource.microsoft.com
if (IsHandleCreated) { 
    OnTextChanged(EventArgs.Empty);
} 

OnSelectedItemChanged(EventArgs.Empty);
OnSelectedIndexChanged(EventArgs.Empty); 

各イベントのハンドラーがあり、特定の順序で実行する必要がある場合 はTextChanged、イベントが発生したことを示す何らかのインジケーターをイベントに検索させ、ハンドラーからハンドラーをSelectedIndexChanged呼び出すか、すべての作業を実行するだけです。TextChangedSelectedIndexChangedSelectedIndexChanged

特定の順序で実行する必要がある理由によって異なります。

于 2012-11-01T21:50:21.637 に答える
0

できることはありますが、解決策は良いものではありません。自分が行ったことを忘れると、将来アプリケーションを保守する可能性のある人や自分自身を確実に混乱させるでしょう。しかし、とにかくここにあります:

アイデアは、同じ関数で両方のイベントを処理し、インデックスとテキストの古い値を追跡して、それに応じてイベントがどのように処理されるかを注文できるようにすることです

// two fields to keep the previous values of Text and SelectedIndex
private string _oldText = string.Empty;
private int _oldIndex = -2;
.
// somewhere in your code where you subscribe to the events
this.ComboBox1.SelectedIndexChanged += 
new System.EventHandler(ComboBox1_SelectedIndexChanged_AND_TextChanged);
this.ComboBox1.TextChanged+= 
new System.EventHandler(ComboBox1_SelectedIndexChanged_AND_TextChanged);
.
.

/// <summary>
///  Shared event handler for SelectedIndexChanged and TextChanged events.
///  In case both index and text change at the same time, index change
///  will be handled first.
/// </summary>
private void ComboBox1_SelectedIndexChanged_AND_TextChanged(object sender, 
        System.EventArgs e)
{

   ComboBox comboBox = (ComboBox) sender;

   // in your case, this will execute on TextChanged but 
   // it will actually handle the selected index change
   if(_oldIndex != comboBox.SelectedIndex) 
   {
      // do what you need to do here ...   

      // set the current index to this index 
      // so this code doesn't exeute again
      oldIndex = comboBox.SelectedIndex;
   }
   // this will execute on SelecteIndexChanged but
   // it will actually handle the TextChanged event
   else if(_oldText != comboBox.Test) 
   {
      // do what you need to ...

      // set the current text to old text
      // so this code doesn't exeute again 
      _oldText = comboBox.Text;      
   }

}

このコードは、イベントが個別に発生した場合 (テキストの変更のみ、またはインデックスの変更のみ) にも機能することに注意してください。

于 2012-11-02T01:04:41.803 に答える
0
if ( SelectedIndex == -1 )  // only the text was changed.
于 2013-11-16T17:35:21.527 に答える