【问题标题】:Clearing MOST labels on form, NOT all清除表格上的大部分标签,而不是全部
【发布时间】:2014-01-03 18:38:06
【问题描述】:

我需要清除我的 Windows 窗体应用程序上的 32 个标签,还有其他标签存在,但我确实想要清除这些。有没有更有效和更少编码的方式来做到这一点?我目前使用方法的代码如下:(sn-p)

private void ClearFields()
{
    label50.Text = string.Empty;
    label51.Text = string.Empty;
    label52.Text = string.Empty;
    label53.Text = string.Empty;
    label54.Text = string.Empty;
    label55.Text = string.Empty;
    // Down to label82
}

我已经研究过,但它总是清除所有标签/文本框。

【问题讨论】:

  • 标签都在同一个面板中吗?然后您可以循环面板的子项并检查名称是否介于 label50 和 label82 之间。但这不会有效率。
  • 无论您做什么,都将归结为确定要清除的部分和要留下的部分之间的区别。所有的答案都解决了这个问题。选择随着时间的推移最不可能改变的选项。意思是避免你可能改变的东西,这会破坏你的“搜索”逻辑。

标签: c# winforms visual-studio .net-3.5


【解决方案1】:

您可以将对象添加到要清除的LabelTag

Label label50 = new Label();
bool deleteMe = true;
label50.Tag = deleteMe;

然后只需遍历您的标签并清除所有Tagtrue 的位置:

foreach(Label lbl in myLabels)
{
    if(lbl.Tag != null && lbl.Tag is bool && (bool)lbl.Tag == true)
    {
        lbl.Text = String.Empty;
    }
}

【讨论】:

    【解决方案2】:

    尝试以下行:

    foreach (Label _label in this.Controls.OfType<Label>().Where(a => a.Name != "Lable32").Select(a => a).ToArray())
                _label.Text = string.Empty;
    

    如果有很多,请在 where 条件下添加不可移除标签。这里除了lable32之外的所有标签文本都将设置为空。

    【讨论】:

      【解决方案3】:

      我建议您将所有需要清除的标签放在某种硬币容器中。这样你就可以做一些事情:

      foreach (var child in container.Children)
      {
          if (child is Label)
          {
              ((Label)child).Text=String.Empty;
          }
      }
      

      我对WinForms不是很熟悉,但我认为那里有容器。

      【讨论】:

        【解决方案4】:

        将您不想清除的标签的 Tag 属性设置为字符串 "DoNotClear"(使用属性窗口或代码),然后使用以下 LINQ 代码:

        foreach (var label in Controls.OfType<Label>().Where(l => l.Tag != "DoNotClear"))
            label.Text = string.Empty;
        

        【讨论】:

          【解决方案5】:

          解决方案:您可以使用Controls.Find() 方法查找从id label50label82 的控件,并为每个识别的Label 分配String.Empty

          试试这个:

                 private void button1_Click(object sender, EventArgs e)
                  {
                      for(int i=50;i<83;i++)
                      {
                          this.Controls.Find("label" + i,true)[0].Text = String.Empty;
                      }
                  }
          

          【讨论】:

            【解决方案6】:

            如果所有标签的名称都像 label + id

            var labelsToClear = from l in Controls.OfType<Label>()
                                let id = Int32.Parse(l.Name.Replace("label", "")) 
                                where id >= 50 && id <= 82
                                select l;
            
            foreach(var label in labelsToClear)
               label.Text = String.Empty;
            

            如果标签可以有不同的名称,那么您可以过滤掉与label + id 模式匹配的标签:

            Controls.OfType<Label>().Where(l => Regex.IsMatch(l.Name, @"^(?:label)\d+$"))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-08-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-31
              • 2014-09-22
              • 2021-09-03
              • 1970-01-01
              相关资源
              最近更新 更多