WinForms NumericUpDown:有没有办法阅读有关文本选择的信息?

时间:2013-11-08 13:38:27

标签: winforms selection textselection numericupdown

WinForms NumericUpDown允许我们使用Select(Int32,Int32)方法选择其中的文本范围。有没有办法设置/检索所选文本的起始点,选择的字符数和文本的选定部分,就像我们可以使用SelectionStart,SelectionLength和SelectedText属性为其他类似文本框的控件那样做?

3 个答案:

答案 0 :(得分: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; }
  }
}

答案 1 :(得分:1)

与LarsTech的答案类似,您可以快速将NumericUpDown.Controls[1]转换为TextBox来访问这些属性,而无需创建新类。

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

答案 2 :(得分:0)

对于vanilla 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;
    }
}

干杯