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

Posted

技术标签:

【中文标题】WinForms NumericUpDown:有没有办法阅读有关文本选择的信息?【英文标题】:WinForms NumericUpDown: Is there a way to read the info about text selection? 【发布时间】:2013-11-20 13:03:11 【问题描述】:

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

【问题讨论】:

【参考方案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】:

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; 
  

【讨论】:

这是个好主意!!我知道NumericUpDown由几个子控件组成,其中一个是TextBox,所以实际上所有解决方案的重点是如何找到这个文本框。但我猜这种方法是最简单的,而且它也没有使用可能会导致安全限制问题的反射。如果担心子控件索引1,我们可以简单的枚举NumericUpDown.Controls集合,找到TextBox类型的控件,让我们的代码健壮通用。【参考方案3】:

这对于普通的 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;
    

干杯

【讨论】:

以上是关于WinForms NumericUpDown:有没有办法阅读有关文本选择的信息?的主要内容,如果未能解决你的问题,请参考以下文章

winforms有没有好的免费的devexpress数据网格替代品? [关闭]

在numericUpDown更改事件中获取numericUpDown更改的值

WPF 项目不支持 NumericUpDown

有没有一种简单的方法可以在 WinForms 中实现 Checked Combobox [重复]

NUmericupdown控件

winforms有没有任何好的和免费的devexpress数据网格替代品?