【问题标题】:component which inherits from textbox control从文本框控件继承的组件
【发布时间】:2019-06-30 12:31:21
【问题描述】:

我正在尝试创建一个从文本框控件(Visual Studio 2017,使用 C# 的 Web 窗体应用程序)继承控件的组件。

我正在尝试使该文本框只能接受数值,如果文本框有超过 11 个字符,那么它们的字符将显示为红色。

我了解如何从组件类返回一个字符串,但我不太了解如何将改变颜色的方法转移到文本框所在的主类。

组件类部分:

public partial class textbox : Component
   {
       public textbox()
       {
           InitializeComponent();
    }

    public textbox(IContainer container)
    {
        container.Add(this);

        InitializeComponent();
    }

//METHOD TO BE USED IN add_drivers
    public void textBox1_TextChanged(object sender, EventHandler e)
    {
        if (textBox1.MaxLength > 11)
        {
            textBox1.ForeColor = Color.Red;
        }

    }

add_driver 类:

namespace Component
{
    public partial class add_driver : Form
    {
    public add_driver()
    {
        InitializeComponent();
    }

    private void add_driver_Load(object sender, EventArgs e)
    {

    }



    private void phoneNr_textbox_TextChanged(object sender, EventArgs e)
    {

  // IN THIS PART I'M NOT SURE HOW TO CALL METHOD FROM COMPONENT
    }

    private void phoneNr_textbox_KeyPress_1(object sender, KeyPressEventArgs e)
        {
        }
   }
    }

【问题讨论】:

    标签: c# visual-studio inheritance methods components


    【解决方案1】:

    您需要在您的 textbox 类中处理 KeyPress 事件,该事件应该从现有的 TextBox 类继承 - 否则您需要重新创建所有现有的 TextBox 行为!另外,请注意 C# 中类和方法名称的标准大小写是 CamelCase,而不是 snake_case 或 pascalCase。

    public partial class MyTextBox : TextBox
    {
       public MyTextBox()
       {
         InitializeComponent();
       }
    
      protected override void OnTextChanged(object sender, EventArgs e)
      {
         if (this.Text.Length > 11)
         {
           this.ForeColor = Color.Red;
         }
      }
    
      protected override void OnKeyPressed(object sender, KeyPressedEventArgs e)
      {
        // check for a number, set e.Handled to true if it's not a number
        // may need to handle copy-paste and other similar actions
      }
    }
    

    您可能需要处理一些额外的边缘情况,或者您可能希望添加一些生物舒适度以方便您的新组件的使用(例如,添加一个属性以直接获取数值,而不是让Text 属性每次)。

    鉴于您已将这些方法添加到您的 MyTextBox 类中,您将不需要在您的 AddDrivers 表单中为它们提供事件处理程序。

    【讨论】:

    • 感谢您的回答,但我仍然不确定如何从 AddDrivers 类中使用该组件。当我尝试使用您的示例创建它时,它不断给出错误“找不到合适的方法来覆盖”。感谢您提供有关命名的说明。
    • 您使用的是标准 WinForms 吗?
    • 是的,但没关系,我设法做到了。唯一的问题是被覆盖的方法没有对象发送者。但现在我的文本框工作正常,所有代码都在组件中。谢谢
    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    相关资源
    最近更新 更多