【问题标题】:Win Form Calculator: Buttons 0 - 9 Event handler to perform repetitive task赢表计算器:按钮 0 - 9 执行重复任务的事件处理程序
【发布时间】:2010-10-02 00:26:56
【问题描述】:

我有一个看起来像典型计算器的获胜表单 UI。自然,我不想为每个数字按钮(0-9)重写相同的逻辑。我希望能够知道单击了哪个按钮,以便可以根据它的 text 属性执行计算。我应该只创建一个接受按钮对象作为参数的方法来促进代码重用吗?有没有更好的办法?我想听听更多资深的 Win Form 应用程序开发人员将如何处理这个问题。我试图将我的逻辑排除在 UI 之外。

谢谢!

【问题讨论】:

    标签: c# winforms calculator


    【解决方案1】:

    事件处理程序的典型签名是void EventHandler(object sender, EventArgs e)。重要的部分是object sender。这是触发事件的对象。对于Button 的点击事件,发送者将是Button

    void digitButton_Click(object sender, EventArgs e)
    {
        Button ButtonThatWasPushed = (Button)sender;
        string ButtonText = ButtonThatWasPushed.Text; //the button's Text
        //do something
    
        //If you store the button's numeric value in it's Tag property
        //things become even easier.
        int ButtonValue = (int)ButtonThatWasPushed.Tag;
    }
    

    【讨论】:

    • +1 用于使用 Control.Tag,这比使用 Text 的 hack 安全得多。我特别在考虑本地化问题。
    【解决方案2】:

    在指定事件处理程序时,您可以注册相同的函数来处理多个事件(如果在 VS.Net 中,请转到属性,选择事件部分(闪电按钮),单击下拉菜单)。这样,您将编写一个事件处理函数来处理所有按钮。

    如果按钮创建和事件注册是在代码中完成的示例 (C#):

    public void digitButtons_Click(object sender, EventArgs eventArgs) {
        if(sender is Button) {
            string digit = (sender as Button).Text;
            // TODO: do magic
        }
    }
    
    public void createButtons() {
        for(int i = 0; i < 10; i++) {
            Button button = new Button();
            button.Text = i.ToString();
            button.Click += digitButtons_Click;
            // TODO: add button to Form
        }
    }
    

    【讨论】:

    • +1:显然击败了我......而且我也喜欢 createButtons。当然,它依赖于布局管理器来做好工作。
    • 是的,我不得不在下面的原作者帖子的其中一个 cmets 中解释这一点。
    猜你喜欢
    • 2019-10-24
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多