加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读