2011-08-18 53 views
3

我有以下方法:C#对象发件人 - 获取方法从它被称为

private void button_Click(object sender, EventArgs e) 
    { 
      //Changes the Text in the RichBox, EXAMPLE: 
      richtTextBox.Text = "Now Changed and calling Method richTextBox_TextChanged"; 
    } 

而且,

private void richTextBox_TextChanged(object sender, EventArgs e) 
{ 
     //Wants something like that 
     if(called from button_click) 
     { 
      //DO SOMETHING 
     } 
     else 
     { 
      //DO SOMETHING 
     } 
} 

我怎样才能解决这个问题,要知道,如果它被称为从Button_click? 我是否必须使用对象发件人来获取信息?但是如何?

希望能跟大家能帮助我

+1

的第一件事进入脑海的是,你可以有某种指标或标志将被设置一次button_Click被调用,您可以检查标志richTextBox_TextChanged和复位。但我相信这是直接的解决方案,对于桌面应用程序开发人员所知的这种情况,必须有更好的解决方案。 – Incognito

回答

4

只需使用一个标志:

private bool _isInButtonClick; 

private void button_Click(object sender, EventArgs e) 
{ 
     try 
     { 
      _isInButtonClick = true; 
      //Changes the Text in the RichBox, EXAMPLE: 
      richtTextBox.Text = "Now Changed and calling Method richTextBox_TextChanged"; 
     } 
     finally 
     { 
      _isInButtonClick = false; 
     } 
} 


private void richTextBox_TextChanged(object sender, EventArgs e) 
{ 
     if(_isInButtonClick) 
     { 
      //DO SOMETHING 
     } 
     else 
     { 
      //DO SOMETHING 
     } 
} 
+0

在finally块中重置'_isInButtonClick'看起来会出现问题,因为它可以在'richTextBox_TextChanged'中'if'块之前执行,所以我认为最好重置“richTextBox_TextChanged”中的值。 – Incognito

+0

因此,这是不工作,他从来没有走进:if(_isInButtonClick) { // DO SOMETHING } – eMi

+1

@eMi是的...最好重置该标志在richTextBox_TextChanged,你会得到你想要的结果。 – Incognito

2
private void richTextBox_TextChanged(object sender, EventArgs e) 

这里sender是RichTextBox的,而不是改变文本的按钮。

你可以进入栈跟踪来发现按钮点击是否在调用堆栈上,但这是过度杀伤(就像使用nuke破解核桃)。

在窗体中添加一个标志(bool),并在按钮单击中将其设置为true,然后在TextChanged事件中检查它,然后在按钮单击结束时再次将其设置为false。

如果你这样做,我会建议在实现IDispose的类中包装这个signal逻辑并在using语句中使用它。

这就是说,你确定你需要这个功能吗?

+0

听起来很复杂^^我认为有可能对发件人做些什么.. – eMi