【问题标题】:Dynamically update labels动态更新标签
【发布时间】:2018-10-22 07:01:40
【问题描述】:

如何动态更新表单中标签的文本,使其文本按从 1 到 25 的顺序编号?

在伪代码中,如下所示:

for (int i = 1; i <= 25; i++) {
    label + 'i'.Text = "i";
}

【问题讨论】:

  • 标签数组/列表?
  • 所以你有 25 个标签,分别命名为 Label1、Label2 等,你想循环遍历它们,将它们的文本设置为它们的数字后缀?
  • 是的,我想一个数组可以解决问题。谢谢!!!
  • @FrancescoB。是的,正是
  • 你使用的是winforms,对吧?

标签: c# winforms


【解决方案1】:

我会这样做(经过测试):

foreach (var label in Controls.OfType<Label>())
{
    label.Text = label.Name.Replace("label", "");
}

由于您不需要按顺序填充所有标签文本,因此您可以遍历它们并替换“标签”文本。 假设是您所做的假设,即所有标签都命名为“label1”、“label2”等,再加上所有标签都在一个公共控件(面板)或窗口本身内,这就是我所做的。


编辑:其他想法

上述解决方案可行,但为了让事情更有趣,您可以添加一种方法来防止处理不遵守您的命名约定的标签(即“标签”后跟数字):

foreach (var label in Controls.OfType<Label>())
{
    if (RespectsNamingConvention(label.Name))
    {
        label.Text = label.Name.Replace("label", "");
    }
}

你在哪里

private bool RespectsNamingConvention(string name)
{
    var Suffix = name.Replace("label", "");
    return 
        name.StartsWith("label") &&
        Suffix.Count() > 0 &&
        Suffix.Where(e => !Char.IsDigit(e)).Count() == 0;
}

即您检查您的标签名称是否以“label”开头,后跟仅包含数字的内容。

另一个改进可能是在您的窗口中获取所有标签,即使它们不在同一个控件中。

这可以像question 中所示那样完成。

【讨论】:

  • @GrantWinney 谢谢。也许我的第一个答案太简洁了,或者投票者想“惩罚”一个他认为不值得的问题的答案。最好的问候。
【解决方案2】:

动态获取类的成员需要反射。像这样的东西应该做你想做的事。您需要根据字段的声明方式对其进行调整。

for (int i = 0; i < 8; i++)
{
    var property = this.GetType().GetProperty("label" + i);
    var label = (Label)property.GetValue(this);
    label.Text = "Label " + i;
}

【讨论】:

  • “动态获取类的成员需要反射。” 不,它不需要。您添加到 Windows 窗体的每个控件都在 .Controls 集合中可用,并且可以按名称索引,因此您可以将所有反射代码替换为 var label = Controls["label" + i];
  • 在这种情况下,是的,你是对的。但是,通常您需要使用反射来以这种方式获取成员。
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
相关资源
最近更新 更多