Winforms中的自定义控件库

Winforms中的自定义控件库,winforms,user-interface,c#-4.0,custom-controls,Winforms,User Interface,C# 4.0,Custom Controls,我想要一个只有数字作为输入的文本框。所以我在文本框的按键事件中编写了以下代码 if(!char.IsDigit(e.KeyChar)) { e.handled = true; } 而且效果很好。但我在应用程序的许多地方通常都需要它们,因此我编写了一个部分类,其中包含以下代码: public partial class digitTextBox : TextBox { public digitTextBox() { this.KeyPress += new

我想要一个只有数字作为输入的文本框。所以我在文本框的按键事件中编写了以下代码

if(!char.IsDigit(e.KeyChar))
{
    e.handled = true;
}
而且效果很好。但我在应用程序的许多地方通常都需要它们,因此我编写了一个部分类,其中包含以下代码:

public partial class digitTextBox : TextBox
{
    public digitTextBox()
    {
        this.KeyPress += new KeyPressEventHandler(digitTextBox_KeyPress);
    }

    void digitTextBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (char.IsDigit(e.KeyChar))
        {
            e.Handled = true;
        }
    }
}
构建我的解决方案后,我在工具箱中获得了一个控件,甚至这个控件也工作得非常好

但我有很多文本框,有一些或其他规范,比如,有些不应该接受特殊字符,有些应该接受小数,有些小数点后最多有2位……等等,我确实需要在许多应用程序中使用这种控件

因此,我想为我的自定义控件编写一个库(.dll),如果可能的话,甚至可以进行验证。老实说,我对使用图书馆不太了解。所以我用两种不同的文本框创建了一个库,并用它们创建了一个.dll文件。现在,我创建了一个不同的winform应用程序,并添加了自定义控件.dll文件的引用。但什么也没发生。
所以我只是想知道我应该采取什么样的方法来实现它。有没有更好的方法来完成这类任务。欢迎提出任何新的建议。提前感谢。

尝试用鼠标右键单击工具箱并选择“选择项…”,然后从可用列表中选择控件。如果看不到它们,请单击“浏览”按钮并选择DLL

另一方面,您可以通过添加属性来组合两个文本框:

public class MyTextBox : TextBox
{
  public bool AllowDigitsOnly { get; set; }

  protected override void OnKeyPress(KeyPressEventArgs e)
  {
    if (this.AllowDigitsOnly)
    {
      if (!char.IsDigit(e.KeyChar))
        e.Handled = true;
    }
    base.OnKeyPress(e);
  }
}

我建议实现一个自定义控件,它基于正则表达式控制输入。如果控件的文本与正则表达式不匹配,我将防止控件失去焦点,而不是限制按键。背景颜色的一些变化或弹出的气球可以用来显示错误和/或输入内容的描述。

我做了类似的事情,帮助我向文本框添加属性,而不是为整数和双精度创建两种不同的类型(基本上允许我的要求使用十进制)

通过创建属性,您实际上可以在设计时在Properties视图中选择文本框是integer还是double。就像在设计期间设置字体、只读等一样

这是我制作属性的代码

        /// <summary>
        /// Identify textbox type as integer or double
        /// </summary>
        public enum numericID
        {
            Integer,
            Double
        };

        /// <summary>
        /// Textbox type property, default is integer
        /// </summary>
        private numericID numericType = numericID.Integer;

        /// <summary>
        /// Getter and setter for property
        /// </summary>
        [Browsable(true),
        DisplayName("TextBoxType"),
        DefaultValue(numericID.Integer),
        Description("Indicates whether the textbox must only accept integers or doubles."),
        Category("Behavior")]
        public numericID NumericType
        {
            get { return numericType; }
            set { numericType = value; }
        }
//
///将文本框类型标识为整数或双精度
/// 
公共枚举数字ID
{
整数,
双重的
};
/// 
///Textbox类型属性,默认值为整数
/// 
私有numericID numericType=numericID.Integer;
/// 
///属性的Getter和setter
/// 
[可浏览(正确),
DisplayName(“TextBoxType”),
默认值(numericID.Integer),
Description(“指示文本框必须只接受整数还是双精度。”),
类别(“行为”)]
公共numericID NumericType
{
获取{return numericType;}
设置{numericType=value;}
}

而onKeyPress事件实际上是非常方便的。它处理所有不同类型的数字字符,您可以选择最适合您的字符。

您能定义“但什么都没发生”吗?什么事没有发生?控件是否不在工具箱中,或者控件是否不像以前那样工作?控件不在工具箱中。但现在我完成了toolboxBrowsable(true)、DisplayName中的choose项…哪个名称空间??