是否可以更改某些事件的調用順序?例如,我有一個ComboBox,當選擇被更改時,我希望在調用TextChanged事件之前調用SelectedIndexChanged事件。我的老實看法是,在SelectedIndexChanged事件之前調用TextChanged事件非常愚蠢,因爲它阻止我知道是否因爲選擇了新項目而調用了TextChanged事件。是否可以更改事件順序?
任何幫助將不勝感激。
是否可以更改某些事件的調用順序?例如,我有一個ComboBox,當選擇被更改時,我希望在調用TextChanged事件之前調用SelectedIndexChanged事件。我的老實看法是,在SelectedIndexChanged事件之前調用TextChanged事件非常愚蠢,因爲它阻止我知道是否因爲選擇了新項目而調用了TextChanged事件。是否可以更改事件順序?
任何幫助將不勝感激。
不,你不能改變的命令 - 這是硬編碼到控制代碼:
// from http://referencesource.microsoft.com
if (IsHandleCreated) {
OnTextChanged(EventArgs.Empty);
}
OnSelectedItemChanged(EventArgs.Empty);
OnSelectedIndexChanged(EventArgs.Empty);
如果你對每個事件處理程序,並需要他們按照一定的順序運行,你可以有 TextChanged
事件查找SelectedIndexChanged
事件發生的某些指示器,然後從SelectedIndexChanged
處理程序中調用TextChanged
處理程序,或者只讓SelectedIndexChanged
完成所有工作。
這取決於爲什麼您需要它們以某種順序運行。
也有一些是你可以做,但解決的辦法是不是一個好&你一定會混淆任何一個誰可能在將來維護你的應用程序,也許自己以及一旦你忘記你做了什麼。但在這裏它是無論如何:
的想法是讓相同功能處理這兩種事件,保持指數的舊值的軌道&文本,以便您可以訂購怎麼事件相應的處理
// 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;
}
}
請注意,當事件分開觸發時,此代碼仍然有效 - 只有文本更改或僅索引更改。
if (SelectedIndex == -1) // only the text was changed.
簡短的回答是否定的,你不能改變在.NET控件中觸發的事件的順序。但也許你不需要。你的用例是什麼?也就是說,你在'TextChanged'中想要做什麼,你需要知道'SelectedIndexChanged'是否已經被解僱? – ean5533
但是文本被改變了......這就是爲什麼它被調用。似乎並不愚蠢。 –
文字被改變_因爲另一個項目被選中_。以錯誤的順序告訴它是愚蠢的,因爲它不能被理解。 – ygoe