【问题标题】:C# / WPF create new button array with multiple functionC# / WPF 创建具有多个功能的新按钮数组
【发布时间】:2017-03-30 18:39:20
【问题描述】:

我写了一段代码,描述如下: 第一个按钮调用FuncPopup(); 函数,之后每个弹出对话框都会创建新按钮。新建按钮创建FuncPopup();。旧按钮应该有各种行为。

        private void FuncPopup()
    {
        FuncMenu popup = new FuncMenu();
        popup.ShowDialog();
        if (popup.DialogResult.HasValue && popup.DialogResult.Value)
        {
            i++;
            newBtn[i] = new Button();
            FuncGird.Children.Add(newBtn[i]);
            Grid.SetColumn(newBtn[i], i);
            Grid.SetRow(newBtn[i], j);
            newBtn[i].Click += (sender, e) => clicked(i);
        }
    }
    void clicked(int g) {
        if (g >= i) 
        {
            FuncPopup(); 
        }
        else (g < i){
            OtherFunction();
        }
    }

i 是一个全局变量。我希望旧按钮运行 OtherFunction();,但它们总是运行 FuncPopup();

【问题讨论】:

    标签: c# wpf button dialog


    【解决方案1】:

    那是因为正如你所说 i 是全局变量,并且你附加了以下处理程序:

     newBtn[i].Click += (sender, e) => clicked(i);
    

    而且你一直在增加i。您可能认为i 的值在您附加此处理程序时是固定的,但事实并非如此。 clicked(i) 中的 i 是同一个全局变量,每次调用都会递增。所以g 在那个处理程序中总是等于i,所以对于所有按钮FuncPopup 都会被调用。

    而是将i 保存到局部变量并使用它:

    int tmp = i;
    newBtn[i].Click += (sender, e) => clicked(tmp);
    

    【讨论】:

    • 干得好,我在本地定义了 tmp 变量,结果达到了我的预期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多