日期:2014-05-19  浏览次数:20835 次

请教,如何知道一个函数是具体由哪个上次函数调用,或者一个事件具体由哪个控件触发?
比如我有两个区域A,B,   我在A中点击鼠标左键,和在B中点击鼠标左键都触发同一事件Click(object   sender,   EventArgs   e),   但是我想在这个事件中,知道具体是由A还是B引起的,就像VS调试中的Call   Back栏那样,能知道上层调用,请问有什么办法知道这个信息吗?
只能这样,如果A是AClick(),   B是BClick(),那不在讨论范围内,请指教,thanks!

------解决方案--------------------
事件里不是有个object 类型的 sender吗。。。
------解决方案--------------------
有参数的话可以以参数类型识别
------解决方案--------------------
ButtonA和ButtonB共用一个Click事件

在事件中
if (sender is ButtonA)
else if (sender is ButtonB)
------解决方案--------------------
可以使用StackTrace来实现,比如:

private void button1_Click(object sender, EventArgs e)
{
StackTrace st = new StackTrace(true);
StackFrame Called = st.GetFrame(1);
System.Console.WriteLine(Called.GetMethod().Name);
}
------解决方案--------------------
又如:
private void button1_Click(object sender, EventArgs e)
{
someMethod();
}

private void someMethod()
{
StackTrace st = new StackTrace(true);
StackFrame Called = st.GetFrame(1);
System.Console.WriteLine(Called.GetMethod().Name);
}

//输出结果为:
button1_Click

------解决方案--------------------

.net 中事件委托原型,具有约定成俗的规范:处理程序的第一个参数表示触发此事件的对象

as,

void Button1_Click(object sender, EventArgs e) {
Button btn = sender as Button;
if(btn != null) {
Console.Write(btn.Text);
}
}
------解决方案--------------------
好好研究一下.net的事件机制吧
object sender是事件源
EventArgs e是传递的信息

------解决方案--------------------
一般根据sender和e都能判断