
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# – 将值传递给动态按钮的事件处理程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)