[100分]C# 如何向事件的回调函数中传递参数?
例如:通常动态订阅btn_Click事件时使用:btn.Click+=newRoutedEventHandler(btn_Click);在不使用全局变量的情况下,如何有效...
例如:
通常动态订阅btn_Click事件时使用:
btn.Click +=new RoutedEventHandler(btn_Click);
在不使用全局变量的情况下,如何有效的向 btn_Click 函数中传递参数呢?
如果使用Lambda 表达式,那要怎样取消匿名函数的订阅呢?
或者提供些应对这种情况的有效措施也行。
ThinkIBM 的方法以前试过,可行,但是面对传递变量的引用时就显得困难重重了。而且会对后期维护带来隐患。
neu_bao 的想法还不太明白,如果能举个更通俗的例子就感激不尽。
zero__style 的结论是肯定的,所以我才寻求解决这种问题的有效途径,即使是回避也行。 展开
通常动态订阅btn_Click事件时使用:
btn.Click +=new RoutedEventHandler(btn_Click);
在不使用全局变量的情况下,如何有效的向 btn_Click 函数中传递参数呢?
如果使用Lambda 表达式,那要怎样取消匿名函数的订阅呢?
或者提供些应对这种情况的有效措施也行。
ThinkIBM 的方法以前试过,可行,但是面对传递变量的引用时就显得困难重重了。而且会对后期维护带来隐患。
neu_bao 的想法还不太明白,如果能举个更通俗的例子就感激不尽。
zero__style 的结论是肯定的,所以我才寻求解决这种问题的有效途径,即使是回避也行。 展开
展开全部
需要明白的概念是VC中的回调函数在C#中是用委托的方式实现,两者都是调用函数的规范,表示了调用本函数会有什么参数和返回值,事件是用委托签名的函数,因为事件就有与签名函数一样的参数和返回值,事件有WINDOWS时间和自定义事件,其根本解决的问题就是当系统或对象内部产生消息后,需要由外部进行处理而产生的外部调用机制,明白了原理,你才能明白他的运作机制,就自然明白他为什么这样,为什么不能那样。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果单纯想要传递参数,不需要固定在这个层面的方法。
你可以再定义一个方法Public void MyBtn_Click(Object sender, RoutedEventArgs e,String mystr)
然后再在btn_Click 方法中调用自己的方法。
MyBtn_Click(sender, e,mystr);
如果你做的基类,那就要继承EventArgs类,自定义一个参数类型。
你可以再定义一个方法Public void MyBtn_Click(Object sender, RoutedEventArgs e,String mystr)
然后再在btn_Click 方法中调用自己的方法。
MyBtn_Click(sender, e,mystr);
如果你做的基类,那就要继承EventArgs类,自定义一个参数类型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
个人想法,你的btn不是孤立的,它是作为一个窗体里的对象存在的
那么你是不是可以通过btn.Form之类的方法获取到这个窗体,从而获取到窗体里的相应属性之类
如果不是公共的,可以通过反射来实现
RoutedEventHandler事件的参数是已经固定了的,就是Object sender, RoutedEventArgs e
所以你无法增加你需要的参数,
不过这个sender,就是触发事件的对象,也就是那个btn,你可以变通一下,给那个btn的某些属性赋值成你希望传递的参数,比如btn.Text = 参数
然后在:btn_Click方法里,把sender转换为btn对象,并获取text属性
那么你是不是可以通过btn.Form之类的方法获取到这个窗体,从而获取到窗体里的相应属性之类
如果不是公共的,可以通过反射来实现
RoutedEventHandler事件的参数是已经固定了的,就是Object sender, RoutedEventArgs e
所以你无法增加你需要的参数,
不过这个sender,就是触发事件的对象,也就是那个btn,你可以变通一下,给那个btn的某些属性赋值成你希望传递的参数,比如btn.Text = 参数
然后在:btn_Click方法里,把sender转换为btn对象,并获取text属性
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
public class MyButton:Button
{
string str = "事件里边要用的数据";
}
然后,你的按钮从自定义类myButton声明和实例化.
MyButton button1 = new MyButton();
button1.str = "更改数据"
事件里边,就可以通过sender访问按钮的自定义成员了
string str = ((myButton)sender).str
至于Lambda 表达式,
如果你直接btn.Click += Lambda 表达式,那么,这个Lambda 表达式的地址对我们来说是未知的,
就像System.Console.WriteLine("我是个字符串,你能找到我吗");里边的字符串一样.
并且,编译器不允许我们这么清空Click: btn.Click = btn.Click - btn.Click(Click只能用于-= +=的左边)
你可以先为Lambda 表达式声明个全局RoutedEventHandler,然后在用的时候先用Lanbda实例化表达式到变量,之后Click事件对这个变量操作就好.
RoutedEventHandler reh;
reh = new EventHandler(
(sender_button1, e_button1) =>
{
((MyButton)sender_button1).Text =((MyButton)sender_button1).str;
} );
btn.Click += reh;
btn.Click -= reh;
{
string str = "事件里边要用的数据";
}
然后,你的按钮从自定义类myButton声明和实例化.
MyButton button1 = new MyButton();
button1.str = "更改数据"
事件里边,就可以通过sender访问按钮的自定义成员了
string str = ((myButton)sender).str
至于Lambda 表达式,
如果你直接btn.Click += Lambda 表达式,那么,这个Lambda 表达式的地址对我们来说是未知的,
就像System.Console.WriteLine("我是个字符串,你能找到我吗");里边的字符串一样.
并且,编译器不允许我们这么清空Click: btn.Click = btn.Click - btn.Click(Click只能用于-= +=的左边)
你可以先为Lambda 表达式声明个全局RoutedEventHandler,然后在用的时候先用Lanbda实例化表达式到变量,之后Click事件对这个变量操作就好.
RoutedEventHandler reh;
reh = new EventHandler(
(sender_button1, e_button1) =>
{
((MyButton)sender_button1).Text =((MyButton)sender_button1).str;
} );
btn.Click += reh;
btn.Click -= reh;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询