c# – 将值传递给动态按钮的事件处理程序

c# – 将值传递给动态按钮的事件处理程序,第1张

概述我正在尝试在Button_Click事件传递两个值 public MyClass(){ Int64 po = 123456; foreach (Expense expense in pr.Expenses) { Button btnExpenseDetail = new Button(); btnExpenseDetail.Text = 我正在尝试在button_Click事件上传递两个值

public MyClass(){    Int64 po = 123456;    foreach (Expense expense in pr.Expenses)    {        button btnExpenseDetail = new button();        btnExpenseDetail.Text = expense.Expensename;        btnExpenseDetail.Location = new Point(startLocation.X + 410,startLocation.Y + (23 *         btnExpenseDetail.Click += (sender,e) => { MyHandler(sender,e,po,expense.Expensename); };                    pnlProjectSummary_Expenses.Controls.Add(btnExpenseDetail);    }}  voID MyHandler(object sender,EventArgs e,string po,string category){    FormExpenseDetails ed = new FormExpenseDetails(po,category);    ed.Show();}

我正在使用visual studio 2010 c#.在面板上,每个button的文本值都是不同的.但按钮’Click_Events的行为完全相同.有人能告诉我哪部分代码我得到这个逻辑错误?

================================================== ======================

解决方法 看起来像普查员常见的陷阱.基本上,如果对lambda使用枚举器变量(在这种情况下为开销),它总是在同一个变量上创建一个闭包,因此它总是使用相同的值.你可以像这样解决它:

foreach (Expense expense in pr.Expenses){    var currentExpense = expense; // <-- This should help. Also use this variable for the lambda.    button btnExpenseDetail = new button();    btnExpenseDetail.Text = currentExpense .Expensename;    btnExpenseDetail.Location = new Point(startLocation.X + 410,startLocation.Y + (23 *     btnExpenseDetail.Click += (sender,currentExpense.Expensename); };                pnlProjectSummary_Expenses.Controls.Add(btnExpenseDetail);}

您可以将lambda视为传递对可变费用的引用.即使变量的值随每次迭代而变化,引用仍指向同一变量.这就是为什么它有助于为每次迭代(currentExpense)创建一个本地范围的变量.字符串值以及位置是不同的,因为它们在每次迭代时被分配到另一个位置(button.Text,button.Location).

总结

以上是内存溢出为你收集整理的c# – 将值传递给动态按钮的事件处理程序全部内容,希望文章能够帮你解决c# – 将值传递给动态按钮的事件处理程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1222101.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存