[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 的结论是肯定的,所以我才寻求解决这种问题的有效途径,即使是回避也行。
展开
 我来答
百度网友dc91b32
2010-11-30 · TA获得超过5650个赞
知道大有可为答主
回答量:5653
采纳率:0%
帮助的人:0
展开全部
Click事件用户无法自主调用(都是由系统调用的),即便能传递参数,你又如何传进去呢?
RoutedEventHandler委托已经第二个参数是事件参数,如果你需要自定义事件,可以用EventHandler<T>或扩展EventHandler重新定义事件,

那要怎样取消匿名函数的订阅呢?
匿名方法无法取消订阅,如果你需要取消订阅的功能,使用命名方法,
zero__style
2010-12-01
知道答主
回答量:23
采纳率:0%
帮助的人:0
展开全部
需要明白的概念是VC中的回调函数在C#中是用委托的方式实现,两者都是调用函数的规范,表示了调用本函数会有什么参数和返回值,事件是用委托签名的函数,因为事件就有与签名函数一样的参数和返回值,事件有WINDOWS时间和自定义事件,其根本解决的问题就是当系统或对象内部产生消息后,需要由外部进行处理而产生的外部调用机制,明白了原理,你才能明白他的运作机制,就自然明白他为什么这样,为什么不能那样。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
neu_bao
2010-12-01 · TA获得超过356个赞
知道小有建树答主
回答量:584
采纳率:0%
帮助的人:465万
展开全部
如果单纯想要传递参数,不需要固定在这个层面的方法。
你可以再定义一个方法Public void MyBtn_Click(Object sender, RoutedEventArgs e,String mystr)
然后再在btn_Click 方法中调用自己的方法。
MyBtn_Click(sender, e,mystr);

如果你做的基类,那就要继承EventArgs类,自定义一个参数类型。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ThinkIBM
2010-12-14 · TA获得超过5289个赞
知道大有可为答主
回答量:3263
采纳率:0%
帮助的人:5473万
展开全部
个人想法,你的btn不是孤立的,它是作为一个窗体里的对象存在的
那么你是不是可以通过btn.Form之类的方法获取到这个窗体,从而获取到窗体里的相应属性之类
如果不是公共的,可以通过反射来实现

RoutedEventHandler事件的参数是已经固定了的,就是Object sender, RoutedEventArgs e
所以你无法增加你需要的参数,
不过这个sender,就是触发事件的对象,也就是那个btn,你可以变通一下,给那个btn的某些属性赋值成你希望传递的参数,比如btn.Text = 参数

然后在:btn_Click方法里,把sender转换为btn对象,并获取text属性
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liuwp526
2010-12-13 · TA获得超过727个赞
知道小有建树答主
回答量:488
采纳率:87%
帮助的人:85.1万
展开全部
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;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(8)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式