从文本框控件继承的组件

Posted

技术标签:

【中文标题】从文本框控件继承的组件【英文标题】: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)
        
        
   
    

【问题讨论】:

【参考方案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 吗? 是的,但没关系,我设法做到了。唯一的问题是被覆盖的方法没有对象发送者。但现在我的文本框工作正常,所有代码都在组件中。谢谢

以上是关于从文本框控件继承的组件的主要内容,如果未能解决你的问题,请参考以下文章

递归组件列表后文本框属性变回

android 文本输入框里面如何添加别的组件???

从 MFC 中的编辑控件写入文本 [重复]

winform开发中,继承UserControl的用户控件,在其中添加文本框,运行后在文本框中输入中文显示为乱码

安卓界面组件-文本框

文本组件