【问题标题】:c# - how do I create events and change properties on custom controls that have been overridden?c# - 如何在已被覆盖的自定义控件上创建事件和更改属性?
【发布时间】:2020-06-27 07:03:33
【问题描述】:

我的目标是创建 2 个 Numeric Up Down 控件以在网球中保持得分。所以我必须重写 Numeric Up Down 控件类,但是我不确定如何创建事件或从其他控件的事件中引用这些自定义控件的属性。

我通过这种技术 (https://stackoverflow.com/a/5921599/10886205) 创建了 2 个自定义控件,它允许我从 0、15、30 跳转到 40,并在超过 40 后将文本值放入其中。

但是,Visual Studio的Designer Interface中不存在该控件,所以(因为我是一个“业余程序员”)我不知道如何创建一个事件,例如ValueUp,ValueDown,ValueChanged , 或者如何从任何其他事件更改控件的任何属性,例如值或文本,除了在覆盖事件中使用“this”关键字。但是,这并不能真正帮助我以编程方式链接控件,因此当一个玩家处于“Adv”时,另一个玩家处于“-”,或者当一个玩家达到“Deuce”时,另一个玩家是也在“Deuce”中。 (我试图使用标签和变量,但我认为这是一个死胡同。)

public partial class Form1 : Form
{
    public class NumericUpDownEx : NumericUpDown
    {
        string tennisAdv = "none";
        string whichNumUpDown = "unknown";

        public void Form1() { }

        public override void UpButton()
        {
            if (Value == 0) Value = 15;
            else if (Value == 15) Value = 30;
            else if (Value == 30) Value = 40;
            else base.UpButton();
        }

        public override void DownButton()
        {
            if (Value == 40) Value = 30;
            else if (Value == 30) Value = 15;
            else if (Value == 15) Value = 0;
            else base.DownButton();
        }

        protected override void UpdateEditText()
        {
            if (Value > 40 & Value % 2 == 0)
                this.Text = "Deuce";
            else if (Value > 40 & Value % 2 != 0)
                this.Text = "Adv";
            else this.Text = this.Value.ToString();
        }
      }

    public Form1()
    {
        //create a custom UpDown for Tennis Points
        //Tennis Away Points
        NumericUpDown mynumTennisAwayScorePoints = new NumericUpDownEx
        {
            Location = new Point(249, 33),
            Size     = new Size(52, 20),
            Minimum  = 0,
            Maximum  = 1000
        };

        //Tennis Home POints
        NumericUpDown mynumTennisHomeScorePoints = new NumericUpDownEx
        {
            Location = new Point(249, 32),
            Size     = new Size(52, 20),
            Minimum  = 0,
            Maximum  = 1000
        };

        //create all other standard componets for the form
        InitializeComponent();

        //place the two custom UpDowns 
        ((System.ComponentModel.ISupportInitialize)(mynumTennisAwayScorePoints)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(mynumTennisHomeScorePoints)).BeginInit();

        panel19.Controls.Add(mynumTennisAwayScorePoints);
        mynumTennisAwayScorePoints.Tag = "away";
        panel20.Controls.Add(mynumTennisHomeScorePoints);
        mynumTennisHomeScorePoints.Tag = "home";
    }
}

此时,我有 2 个自定义控件,它们按顺序给出值(0、15、30、40、Adv、Deuce、Adv、Deuce 等),但我有点卡在那里。

【问题讨论】:

    标签: c# .net visual-studio winforms


    【解决方案1】:

    将您的代码放入其自己的文件中(未嵌入到您现有的表单代码中)。单击项目 --> 添加类 --> 输入“NumericUpDownEx” --> 添加。在类的顶部添加一个using System.Windows.Forms; 行,这样它就知道如何从普通的 NumericUpDown 继承。然后移动所有与 NumericUpDownEx 相关的代码,使其如下所示(当然,您的命名空间会有所不同):

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace CS_Scratch_WindowsFormsApp1
    {
    
        public class NumericUpDownEx : NumericUpDown
        {
            string tennisAdv = "none";
            string whichNumUpDown = "unknown";
    
            public NumericUpDownEx()
            {
    
            }
    
            public override void UpButton()
            {
                if (Value == 0)
                    Value = 15;
                else if (Value == 15)
                    Value = 30;
                else if (Value == 30)
                    Value = 40;
                else
                    base.UpButton();
            }
    
            public override void DownButton()
            {
                if (Value == 40)
                    Value = 30;
                else if (Value == 30)
                    Value = 15;
                else if (Value == 15)
                    Value = 0;
                else
                    base.DownButton();
            }
    
            protected override void UpdateEditText()
            {
                if (Value > 40 & Value % 2 == 0)
                {
                    this.Text = "Deuce";
    
                }
                else if (Value > 40 & Value % 2 != 0)
                {
                    this.Text = "Adv";
                }
                else
                {
                    this.Text = this.Value.ToString();
                }
    
            }
    
        }
    
    }
    

    现在,重建后,您应该在工具箱顶部获得一个新部分,其中包含您的新控件:

    因此,您可以像其他控件一样将它们放置在表单上,​​并按照您的预期使用它们的属性和/或事件,而不是通过代码创建实例。

    【讨论】:

    • 啊!这听起来像是我没有做过的可读性的重要事情。现在,我是否应该将其添加到我的项目中已经存在的“...design.cs”/命名空间中?
    • 是的,相同的命名空间。
    • 这个解决方案非常棒!现在,我可以在“设计模式”中看到我的自定义 Numeric Up Downs,我可以为这些控件创建事件,在“设计模式”中调整它们的属性,并引用这些控件以编程方式调整属性。 stackoverflow 上的社区绝对是无价的!搜索一个问题,提出一个问题,令人惊讶的是,你能以多快的速度做出一些非常棒的东西!谢谢@Idle_Mind
    猜你喜欢
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多