【问题标题】:C# change multiple labels by loopingC#通过循环更改多个标签
【发布时间】:2014-07-07 22:45:53
【问题描述】:

为防止代码重复,我正在寻找以下解决方案:

    private void sensor1SetUnits(string newUnit)
    {
        foreach (Control ctrl in groupBoxSensor1.Controls)
        {
            // initialize all labels
            if (ctrl is Label)
            {
                ((Label)ctrl).Text = newUnit;
            }
        }
    }

    private void sensor2SetUnits(string newUnit)
    {
        foreach (Control ctrl in groupBoxSensor2.Controls)
        {
            // initialize all labels
            if (ctrl is Label)
            {
                ((Label)ctrl).Text = newUnit;
            }
        }
    }
  private void uiInitControls()
    {
        sensor1SetUnits(units.celsius);
        sensor2SetUnits(units.celsius);
    }

但是,我有 10 多个组框,并且每次都需要将所有标签更改为另一个单元。

我希望是这样的:

    private void uiSensorChangeUnits(Control * ptrCtrl)
    {
        foreach (Control ctrl in ptrCtrl)
        {
            // initialize all labels
            if (ctrl is Label)
            {
                ((Label)ctrl).Text = units.celsius;
            }
        }

    }

    private void someFunction()
    {
        uiSensorChangeUnits(&groupBoxSensor1.Controls);
        uiSensorChangeUnits(&groupBoxSensor2.Controls);
    }

【问题讨论】:

  • 看看Controls属性返回的类型是什么。将其设为参数的类型,就完成了。
  • C#,但我来自 C

标签: c# loops pointers label


【解决方案1】:

您可以将 GroupBox 传递给方法,然后使用 OfType extension 可以减少寻找合适的控件

private void SetSensorUnitLabels(GroupBox currentGB, string newUnit)
{
    foreach (Label ctrl in currentGB.Controls.OfType<Label>())
    {
       ctrl.Text = newUnit;
    }
}


SetSensorUnitLabels(groupBoxSensor1, units.celsius);
SetSensorUnitLabels(groupBoxSensor2, units.celsius);

【讨论】:

    【解决方案2】:

    好家伙 LINQ 是您最好的选择。

        private void Form1_Load(object sender, EventArgs e)
        {
            UpdateChildrenInGroupBox<Label>("Test Label");
            UpdateChildrenInGroupBox<TextBox>("Test Textbox");
    
            //Wont compile
            //UpdateChildrenInGroupBox<Rectangle>("Test Rectangle");
        }
    
        private void UpdateChildrenInGroupBox<T>(string value) where T: Control
        {
            var allGBs = this.Controls.OfType<GroupBox>();
            var allControlsInGBs = allGBs.SelectMany(f => f.Controls.Cast<Control>());
            allControlsInGBs.OfType<T>().ToList().ForEach(f => f.Text = value);
        }
    

    我们循环遍历 Form 上的所有控件,它的类型为 GroupBox。然后我们选择控件并将其右投给它们。然后我们获取传入的 Type 并设置它们的 Value。

    【讨论】:

      【解决方案3】:
      private void UpdateUnitLabels(GroupBox groupBox, string unit)
      {
          foreach (Control control in groupBox.Controls)
          {
              var label = control as Label;
              if (Label != null)
              {
                  label.Text = unit;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        • 1970-01-01
        • 2020-04-09
        相关资源
        最近更新 更多