Библиотека пользовательских элементов управления в Winforms - PullRequest
0 голосов
/ 22 сентября 2011

Я хотел TextBox только с цифрами в качестве записи.Поэтому я написал следующий код в событиях KeyPress текстового поля

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;
        }
    }
}

, построил свое решение, и я получил контроль в своем наборе инструментов, и даже это работало отлично.

Но у меня было много TextBox с той или иной спецификацией, например, некоторые не должны принимать специальные символы, некоторые должны принимать десятичные числа, некоторые с десятичными до 2 цифр после точки .... и так далее, и я делаюМне нужны такие элементы управления во многих приложениях.

Поэтому я подумал о написании библиотеки (.dll) моих пользовательских элементов управления и, если возможно, даже для их валидации.Честно говоря, я понятия не имею об использовании библиотек.Поэтому я создал библиотеку с двумя различными типами текстовых полей и создал из них файл .dll.Теперь я создал другое приложение winform и добавил ссылку на мой файл .dll с пользовательским элементом управления.Но ничего не случилось.Поэтому я просто хотел знать, каким должен быть мой подход к достижению этого.Есть ли лучший способ для достижения такого рода задач.и любые новые предложения также приветствуются.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 22 сентября 2011

Я бы предложил реализовать один пользовательский элемент управления, который управляет вводом на основе регулярного выражения.Вместо ограничения нажатий клавиш я бы предотвратил потерю фокуса элемента управления, если его текст не соответствует регулярному выражению.Некоторое изменение цвета фона или всплывающее окно можно использовать для отображения ошибок и / или описания предполагаемого ввода.

0 голосов
/ 22 сентября 2011

Я сделал что-то похожее, и мне помогло добавить свойства в текстовое поле вместо того, чтобы создавать два разных типа для целых и двойных чисел (в основном, разрешая десятичную для моих требований).

Создав свойство, вы фактически можете выбрать, хотите ли вы, чтобы текстовое поле было целым или двойным в представлении «Свойства» во время разработки. Так же, как у вас есть Font, ReadOnly и т. Д., Которые вы установили во время разработки.

Вот мой код для создания свойств,

        /// <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; }
        }

и событие onKeyPress на самом деле очень удобно с веб-сайта msdn . Он обрабатывает все различные типы символов для чисел, и вы можете выбрать тот, который лучше всего подходит для вас.

0 голосов
/ 22 сентября 2011

Попробуйте щелкнуть правой кнопкой мыши ToolBox и выберите «Выбрать элементы ...», а затем выберите элементы управления из доступного списка. Если вы их не видите, нажмите кнопку «Обзор» и выберите свою 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);
  }
}
...