Строка <-> int / float боль преобразования в .net winform - PullRequest
0 голосов
/ 25 февраля 2010

свойство Text элемента управления в winform всегда является строковым типом, поэтому, если я хочу выставить свойство другого типа для настраиваемого элемента управления, я должен выполнить преобразование следующим образом, если у меня есть десятки свойств для отображения, он будет таким боль для меня.

  public int ImageGroupLength
    {
        get
        {
            return int.Parse(this.imageGroupLength.Text);
        }
        set
        {
            this.imageGroupLength.Text = value.ToString();
        }
    }

Итак, есть ли какой-нибудь элегантный способ сделать преобразование?

Ответы [ 3 ]

1 голос
/ 25 февраля 2010

Создание вашего собственного элемента управления - это путь сюда. Добавьте новый класс в ваш проект и вставьте код, показанный ниже. Компиляция. Новый элемент управления отображается в верхней части панели инструментов. Вы захотите реализовать событие BadValue, чтобы предупредить пользователя о том, что введенный текст не подходит. И ValueChanged доступен для получения события при изменении свойства Value.

using System;
using System.Windows.Forms;

class ValueBox : TextBox {
  public event EventHandler BadValue;
  public event EventHandler ValueChanged;

  private int mValue;
  public int Value {
    get { return mValue; }
    set {
      if (value != mValue) {
        mValue = value;
        OnValueChanged(EventArgs.Empty);
        base.Text = mValue.ToString();
      }
    }
  }
  protected void OnValueChanged(EventArgs e) {
    EventHandler handler = ValueChanged;
    if (handler != null) handler(this, e);
  }
  protected void OnBadValue(EventArgs e) {
    EventHandler handler = BadValue;
    if (handler != null) handler(this, e);
  }
  protected override void OnHandleCreated(EventArgs e) {
    base.OnHandleCreated(e);
    base.Text = mValue.ToString();
  }
  protected override void OnValidating(System.ComponentModel.CancelEventArgs e) {
    int value;
    if (!int.TryParse(base.Text, out value)) {
      SelectionStart = 0;
      SelectionLength = base.Text.Length;
      e.Cancel = true;
      OnBadValue(EventArgs.Empty);
    }
    else base.OnValidating(e);
  }
}
1 голос
/ 25 февраля 2010

Рассматривали ли вы создание подкласса элемента управления TextBox и просто поместили его на свой пользовательский элемент управления? Вы можете создать новое свойство, которое анализирует входную строку и возвращает целое число.

0 голосов
/ 25 февраля 2010

Не совсем, но вы можете, по крайней мере, получить некоторую безопасность, используя что-то вроде этого. Это избавит вас от боли в сердце, когда люди попытаются вставить текст в поле длины!

public int ImageGroupLength
{
  get
  { 
    int ret;
    int.TryParse(this.imageGroupLength.Text, out ret);

    return ret; //Ret will be 0 if tryparse fails
  }
  set
  {
    ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...