Я собираюсь сделать обоснованное предположение, что вы сами не поднимаете Событие 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();
}