2013-11-08 4 views
1

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

ответ

2

NumericUpDown Contr ol имеет внутренний 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; } 
    } 
} 
+0

Это отличная идея! Я знал, что NumericUpDown состоит из нескольких суб-элементов управления, а один из них - TextBox, поэтому на самом деле ключевым моментом всех решений является то, как найти это текстовое поле. Но этот подход, на мой взгляд, самый простой, и он также не использует отражение, которое может вызвать проблемы с ограничениями безопасности. Если мы будем беспокоиться о индексе субконтроля 1, мы можем просто перечислить коллекцию NumericUpDown.Controls и найти элемент управления типа TextBox, чтобы сделать наш код надежным и универсальным. – TecMan

0

Это невозможно с помощью ванильного элемента 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; 
    } 
} 

Приветствия

1

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

((TextBox)numericUpDown1.Controls[1]).SelectionLength; // int 
((TextBox)numericUpDown1.Controls[1]).SelectionStart; // int 
((TextBox)numericUpDown1.Controls[1]).SelectedText; // string 
Смежные вопросы