【问题标题】:Getting the "value" property of a control获取控件的“值”属性
【发布时间】:2017-11-11 20:18:38
【问题描述】:

我有一个带有Control 参数的方法。我想获得控件的值。所以如果是TextBox,则获取Text属性的值;如果是NumericUpDown,则获取Value 属性的值,依此类推。

问题是我不能写这样的东西:

Method(Control control)
{
    control.Text;
}

Method(Control control)
{
    control.Value;
}

因为无法保证控件具有这些属性之一,如果确实具有它,它的名称是什么。 有没有办法做这样的事情?

【问题讨论】:

  • C# 中有 if (foo is TextBox)... 构造...如果没有看到当前代码和改进方向,很难看出你想用它走多远。
  • @AlexeiLevenkov - 好吧,我不确定究竟有什么解决方案。我确实尝试了您建议的if 声明,但它并不优雅。我想也许Control 里面有一些属性,它指的是保存值的属性或类似的东西。我找不到任何方法,但我想也许还有其他方法。
  • 控件类中没有这样的属性。

标签: c# winforms


【解决方案1】:

Control 类中没有这样常见的 Value 属性。

您应该使用一些 if/else 或 switch/case 或字典方法从控件中获取值。因为你知道你需要什么属性。该控件仅提供属性。

例如ComboBox,其值是多少?是SelectedItemSelectedIndexSelectedValueText?它基于使用/意见。

最接近您正在寻找的东西是依靠控件的DefaultProperty 属性来使用relfection 从该属性中获取值。比如有这个方法:

public object GetDefaultPropertyValue(Control c)
{
    var defaultPropertyAttribute = c.GetType().GetCustomAttributes(true)
        .OfType<DefaultPropertyAttribute>().FirstOrDefault();
    var defaultProperty = defaultPropertyAttribute.Name;
    return c.GetType().GetProperty(defaultProperty).GetValue(c);
}

您可以通过这种方式获取值:

var controls = new List<Control> {
    new Button() { Text = "button1" },
    new NumericUpDown() { Value = 5 },
    new TextBox() { Text = "some text" },
    new CheckBox() { Checked = true }
};

var values = controls.Select(x => GetDefaultPropertyValue(x)).ToList();

【讨论】:

  • 不错。如果值有问题,那么获得这样的值的价值也很重要:) - 由于该方法的结果将有截然不同的类型,我很难看到 OP 将如何处理数字、字符串、布尔值和更复杂的对象的这种混合.但这肯定会让他们得到最接近他们所要求的东西。
  • @AlexeiLevenkov 我也不知道这个问题背后的原因,对我来说它似乎是一个XY Problem。但是 OP 应该知道他们应该使用一些 if/else 或 switch/case 或字典方法来从控件中获取值。因为他们知道他们需要什么财产。该控件仅提供属性。例如,对于 ComboBox,值是多少?是 SelectedItem、SelectedIndex、SelectedValue、Text 吗?它基于使用/意见。
  • 基本上,我有一个方法应该获取一个控件作为参数,并验证控件的值。
  • @Sipo 所以你需要知道值的类型,这意味着你需要一些类型转换和 if/else 或 switch/case。对于验证,您可能需要考虑some other options
  • 谢谢。我确实使用了Validating 事件和ErrorProvider
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多