WinForms NumericUpDown: есть ли способ прочитать информацию о выделении текста?

WinForms NumericUpDown позволяет нам выбирать диапазон текста внутри него, используя метод Select(Int32, Int32). Есть ли способ установить / получить начальную точку выбранного текста, количество выбранных символов и выделенную часть текста, как мы можем сделать это для других элементов управления, подобных текстовым полям, используя свойства SelectionStart, SelectionLength и SelectedText?

3 ответа

Решение

Элемент управления NumericUpDown имеет внутренний TextBox, доступный из коллекции элементов управления. Это второй элемент управления в коллекции после элемента управления UpDownButtons. Поскольку WinForms больше не разрабатывается, практически безопасно сказать, что базовая архитектура элемента управления NumericUpDown не изменится.

Унаследовав от элемента управления NumericUpDown, вы можете легко предоставить следующие свойства TextBox:

public class NumBox : NumericUpDown {
  private TextBox textBox;

  public NumBox() {
    textBox = this.Controls[1] as TextBox;
  }

  public int SelectionStart {
    get { return textBox.SelectionStart; }
    set { textBox.SelectionStart = value; }
  }

  public int SelectionLength {
    get { return textBox.SelectionLength; }
    set { textBox.SelectionLength = value; }
  }

  public string SelectedText {
    get { return textBox.SelectedText; }
    set { textBox.SelectedText = value; }
  }
}

Как и в ответе LarsTech, вы можете быстро разыграть NumericUpDown.Controls[1] как TextBox получить доступ к этим свойствам без создания нового класса.

((TextBox)numericUpDown1.Controls[1]).SelectionLength; // int
((TextBox)numericUpDown1.Controls[1]).SelectionStart; // int
((TextBox)numericUpDown1.Controls[1]).SelectedText; // string

Это невозможно с ванильным элементом управления NumericUpDown.

В этой статье автор объясняет, как он разделил на подклассы элемент управления NumericUpDown, чтобы раскрыть базовый объект TextBox и, таким образом, раскрыть "отсутствующие" свойства:

http://www.codeproject.com/Articles/30899/Extended-NumericUpDown-Control

Он использует отражение, чтобы получить ссылку на базовый объект TextBox:

private static TextBox GetPrivateField(NumericUpDownEx ctrl)
{
    // find internal TextBox
    System.Reflection.FieldInfo textFieldInfo = typeof(NumericUpDown).GetField("upDownEdit", System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
    // take some caution... they could change field name
    // in the future!
    if (textFieldInfo == null) {
        return null;
    } else {
        return textFieldInfo.GetValue(ctrl) as TextBox;
    }
}

ура

Другие вопросы по тегам