huangfang8161 2019-06-12 02:05 采纳率: 0%
浏览 729
已结题

C# 动态加载的多个UserControl 如何更新数据--------深夜在线等

1.需求
1)采用UserControl布置一些控件(button、lable、pictrue)
2)将UserControl在初始化时按配置动态加载到FORM,我采用的是加载到TableLayoutPanel内
3)问题:如何快速简洁正确更新各UserControl中的button、lable、pictrue
图为动态加载后的载图图片说明
图中,有三种UserControl,每种UserControl都有可能存在几个,根据配置来的,不固定

2、我的测试代码(完全新手,完全百度)
度娘找了很多资料,最终看到某文说可以用“"list"来实现数据的操作,但具体如何做不知道。
如果有更好的办法也可以,总之,上图的Pictrue、lable、button等,可以根据实时数据更新(每个UserControl都对应一种设备)

int count = 1;
            LinkedList<UserControl> list = new LinkedList<UserControl>();//双向链表
            LinkedListNode<UserControl> linkNode = list.First;

            for (int i = 0; i < count; i++)
            {
                主枪柜_ctrl userControl1 = new 主枪柜_ctrl();
                userControl1.Parent = tableLayoutPanel1;
                userControl1.Anchor = AnchorStyles.None;
                userControl1.Dock = DockStyle.Fill;
                userControl1.title_lab.Text = "# - " + i.ToString();
                userControl1.open_door_test_btn.Name = "open_door_test_btn_" + i.ToString();
                userControl1.light_btn.Name = "light_btn_" + i.ToString();
                int userControl1length = userControl1.Size.Width / 2;
                int title_lablength = userControl1.title_lab.Size.Width / 2;
                int x = userControl1length - title_lablength;
                userControl1.title_lab.Location = new System.Drawing.Point(x, 6);

                userControl1.open_door_test_btn.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };
                userControl1.light_btn.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };

                list.AddLast(userControl1);
                this.SuspendLayout();
            }
            int count1 = 2;
            for (int i = 0; i < count1; i++)
            {
                副枪柜_ctrl userControl1 = new 副枪柜_ctrl();
                userControl1.Parent = tableLayoutPanel1;
                userControl1.Anchor = AnchorStyles.None;
                userControl1.Dock = DockStyle.Fill;
                userControl1.title_lab.Text = "# - " + i.ToString();
                userControl1.open_door_test_btn.Name = "open_door_test_btn_" + i.ToString();
                userControl1.light_btn.Name = "light_btn_" + i.ToString();
                int userControl1length = userControl1.Size.Width / 2;
                int title_lablength = userControl1.title_lab.Size.Width / 2;
                int x = userControl1length - title_lablength;
                userControl1.title_lab.Location = new System.Drawing.Point(x, 6);

                userControl1.open_door_test_btn.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };
                userControl1.light_btn.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };

                list.AddLast(userControl1);
                this.SuspendLayout();
            }
            int count2 = 2;
            for (int i = 0; i < count2; i++)
            {
                弹药柜_ctrl userControl1 = new 弹药柜_ctrl();
                userControl1.Parent = tableLayoutPanel1;
                userControl1.Anchor = AnchorStyles.None;
                userControl1.Dock = DockStyle.Fill;
                userControl1.title_lab.Text = "# - " + i.ToString();
                userControl1.open_door_test_btn.Name = "open_door_test_btn_" + i.ToString();
                userControl1.light_btn.Name = "light_btn_" + i.ToString();

                userControl1.weight_clear_btn_1.Name = "weight_clear_btn_1" + i.ToString();
                userControl1.weight_clear_btn_2.Name = "weight_clear_btn_2" + i.ToString();
                userControl1.weight_clear_btn_3.Name = "weight_clear_btn_3" + i.ToString();
                userControl1.weight_clear_btn_4.Name = "weight_clear_btn_4" + i.ToString();

                int userControl1length = userControl1.Size.Width / 2;
                int title_lablength = userControl1.title_lab.Size.Width / 2;
                int x = userControl1length - title_lablength;
                userControl1.title_lab.Location = new System.Drawing.Point(x, 6);


                userControl1.open_door_test_btn.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name + userControl1.title_lab.Text);
                };
                userControl1.light_btn.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };
                userControl1.weight_clear_btn_1.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };
                userControl1.weight_clear_btn_2.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };
                userControl1.weight_clear_btn_3.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };
                userControl1.weight_clear_btn_4.Click += delegate (object sender, EventArgs e)
                {
                    open_door_test(((Button)sender).Name);
                };
                list.AddLast(userControl1);
                this.SuspendLayout();
            }
            tableLayoutPanel1.AutoScroll = true;


            foreach (var item in list)
            {
                ;
            }

        }
        public void open_door_test(string button)
        {
            MessageBox.Show("按下" + button);
        }
  • 写回答

1条回答 默认 最新

  • threenewbee 2019-06-12 09:16
    关注

    以后不要干深夜等的傻事,深夜你的帖子是待审核状态,根本就发不出来。

    就你的问题,如果你希望动态更新控件,你可以
    foreach (UserControl类型 uc in this.Controls.OfType())
    uc.调用一个方法();

    反过来,如果控件需要更新主程序,可以在控件里定义一个事件
    比如你定义了一个 UpdateMainUI 的事件
    那么添加创建控件的时候可以
    UserControl的类型 uc = new UserControl的类型();
    ...
    uc.UpdateMainUI += 你主窗体的一个事件函数;
    在这个函数里更新

    评论

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题