c# – 将值传递给动态按钮的事件处理程序
发布时间:2020-12-16 00:02:52 所属栏目:百科 来源:网络整理
导读:我正在尝试在Button_Click事件上传递两个值 public MyClass(){ Int64 po = 123456; foreach (Expense expense in pr.Expenses) { Button btnExpenseDetail = new Button(); btnExpenseDetail.Text = expense.ExpenseName; btnExpenseDetail.Location = new P
我正在尝试在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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |