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