【问题标题】:c# panel array simplify codec#面板数组简化代码
【发布时间】:2017-06-23 07:58:53
【问题描述】:

我想简化这段代码。代码应将所有面板 (panel1 - panel10) 放入面板数组中

解决方案可能是使用 for 循环,但我不知道如何增加面板名称:

public Form1()
    {
        InitializeComponent();

        Panel[] arr = new Panel[10];

        int i = 0;
        arr[i] = panel1;
        arr[i++] = panel2;
        arr[i++] = panel3;
        arr[i++] = panel4;
        arr[i++] = panel5;
        arr[i++] = panel6;
        arr[i++] = panel7;
        arr[i++] = panel8;
        arr[i++] = panel9;
        arr[i++] = panel10;
    }

【问题讨论】:

  • 仅供参考 i++ 是一个后增量,所以第一个 arr[i++] 相当于 arr[0]
  • 提一下:这是一个 WindowsFormsApplication,在 Form1.cs 上我创建了 10 个面板(如按钮、文本框等)

标签: c# arrays panel simplify


【解决方案1】:
Panel[] panel = new Panel [] 
{
    panel1,
    panel2,
    panel3,
    ...
    panel10,
};

【讨论】:

    【解决方案2】:

    如果panel1..panel10 直接在表单上,​​您可以尝试Linq

     using System.Linq;
     using System.Text.RegularExpressions;
    
     ...
    
     public Form1() {
       InitializeComponent();
    
       // If you want all the panels, remove (comment out) "Where"
       Panel[] arr = Controls
        .OfType<Panel>()
        .Where(panel => Regex.IsMatch(panel.Name, "^panel([0-9]|(10))$"))
        .ToArray();
     }
    

    编辑:如果您有42 面板,您唯一需要更改的就是过滤器Where

     public Form1() {
       InitializeComponent();
    
       Panel[] arr = Controls
         .OfType<Panel>()
         .Where(panel => {
            // Given a panel you have to decide should you add it to array or not
            var match = Regex.Match(panel.Name, "^panel(?<num>[0-9]+)$");
    
            return match.Success &&
                   int.Parse(match.Groups["num"].Value) >= 0 &&
                   int.Parse(match.Groups["num"].Value) <= 42; })
         .ToArray();
     }
    

    如果您想用Name 组织所有面板,例如panelNumber(例如panel2panel17panel347...),您可以将Where 简化为

     .Where(panel => Regex.IsMatch(panel.Name, "^panel[0-9]+$"))
    

    【讨论】:

    • 谢谢 :) 这对我有帮助!
    • 如果我有 42 个面板而不是 10 个,你能编辑这段代码吗?
    • @Pascal Niederberger:您唯一需要编辑的是过滤器Where - 要组织到数组中的面板
    【解决方案3】:

    使用如下内容创建数组:

    public Form1()
        {
            InitializeComponent();
            Panel[] arr = new Panel[]{
            panel1,
            panel2,
            panel3,
            panel4,
            panel5,
            panel6,
            panel7,
            panel8,
            panel9,
            panel10
      };
    }
    

    【讨论】:

      【解决方案4】:

      另一种解决方案是使用反射,例如:

      Panel[] arr = new Panel[10];
      const string PanelName = "panel";
      for (int i = 0; i < arr.Length; i++)
      {
          FieldInfo pi = GetType().GetField(PanelName + (i + 1),
              BindingFlags.NonPublic | BindingFlags.Instance);
          arr[i] = ((Panel)pi.GetValue(this));
      }
      

      请注意,这只是一个示例。如果面板不可用,则此代码将由于返回 null 而崩溃。如果可以的话,您需要稍微改进一下代码。

      【讨论】:

      • 请添加using System.Reflection;
      • 你需要从 1 开始,而不是从 0 开始
      【解决方案5】:

      你为什么不试试 Linq?假设所有面板都在表单中。

      var panelArr = Controls.OfType<Panel>(); //Filtering based on Type
      panelArr.Where(p=> Regex.IsMatch(p.Name, "^panel([0-9]|(10))$")) //Filtering based on Panel Name
      panelArr.ToArray(); //Fianlly into Array
      

      【讨论】:

        【解决方案6】:

        您可以设置名称panel.Name = "pnl" + i.ToString();

        public Form1()
        {
            InitializeComponent();
        
            Panel[] arr = new Panel[10];
        
            for (int i = 0; i < arr.Length; i++)
            {
                Panel panel = new Panel();
                panel.Name = "pnl" + i.ToString();
                arr[i] = panel;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2013-05-07
          • 1970-01-01
          • 2019-08-20
          • 2011-08-09
          • 2011-07-21
          • 2012-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多