我要做出猜測,你是不是提高事件A和事件B自己;假設事件A是TextBox1.TextChanged事件和事件B是TextBox2.TextChanged事件,他們有這樣的處理程序:
public void Textbox1_TextChanged(object sender, EventArgs e)
{
...
TextBox2.Text = someString;
}
public void Textbox2_TextChanged(object sender, EventArgs e)
{
...
TextBox1.Text = someOtherString;
}
在這種情況下,處理程序均會通過提高其他文本框的TextChanged事件改變文本的優點,導致無限遞歸。
你可以做的第一件事,如果你想同時運行一次,只需要標記它們已經在運行(改變在同一個調用中運行的文本框的事件處理程序中的其他文本框結果的文本堆棧:
public void Textbox1_TextChanged(object sender, EventArgs e)
{
if(handler1Running) return; //the second time through we exit immediately
handler1Running = true;
...
TextBox2.Text = "Something"; //the other event handler is invoked immediately
handler1Running = false;
}
public void Textbox2_TextChanged(object sender, EventArgs e)
{
if(handler2Running) return; //the second time through we exit immediately
handler2Running = true;
...
TextBox1.Text = "Something Else"; //the other event handler is invoked immediately
handler2Running = false;
}
現在,它會最深的是三個層次; 1的處理程序調用2的處理器再次調用1的處理程序,它看到的是1的處理程序已經在運行,做任何會加深遞歸之前退出。同樣的事情,如果你通過改變TextBox2開始
你可以做的另一件事是確保你沒有不要試圖將文本框設置爲已經存在的相同值。從一個字符串引用更改爲另一個,即使兩個引用都是相同的字符串值,也會觸發TextChanged事件。如果遞歸必須自然地繼續下去,但會達到穩定狀態,這實際上是第一次嘗試:
public void Textbox1_TextChanged(object sender, EventArgs e)
{
StringBuilder builder = new StringBuilder();
... //build string
//now, even though the builder's ToString will produce a different reference,
//we're making sure we don't unnecessarily change the text.
if(builder.ToString != TextBox2.Text)
TextBox2.Text = builder.ToString();
}
public void Textbox2_TextChanged(object sender, EventArgs e)
{
StringBuilder builder = new StringBuilder();
... //build string
//now, even though the builder's ToString will produce a different reference,
//we're making sure we don't unnecessarily change the text.
if(builder.ToString != TextBox1.Text)
TextBox1.Text = builder.ToString();
}
你能詳細描述一下你正在解決什麼問題嗎?如果我們擁有比事件A更好的上下文,那麼我們將能夠給你更好的答案。事件B會遞歸地觸發事件A.需要重新設計一些事件。 – TheGeekYouNeed 2012-03-12 22:33:18
爲什麼他們互相呼叫,不要調用任何提供您想要觸發的功能的方法? – 2012-03-12 22:33:45
你有兩個選擇來處理這個問題。可能通過同步屬性限制遞歸,或者以不執行觸發其他事件的操作的方式設計事件處理代碼。無論哪種方式,你都沒有足夠的細節來提出答案。也許如果你發佈一些代碼? – JamieSee 2012-03-12 22:38:07