簡體   English   中英

Flowlayout 在控件之間動態添加控件

[英]Flowlayout Adding control in between controls dynamically

我正在對現有應用程序進行更改。 我被困在一個需要在流面板中間添加控件的問題上。 我已經簡化了下面的問題。

每個 object 添加了 label 和按鈕控件。 我在初始屏幕啟動時添加了 3 組對象。

在此處輸入圖像描述

當用戶單擊任何按鈕時,會添加另一個 object:

在此處輸入圖像描述

但是,我需要控件位於單擊它的按鈕下方,而不是添加到底部。 例如,單擊 A 按鈕,然后 Label D 和按鈕 d 應出現在 A 按鈕下方並向下移動其他控件。 該事件是一個按鈕,但也可以是其他事件,例如下拉菜單,但規則/行為是相同的。 是否可以在流面板中間添加控件?

以下是代碼示例:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApp8
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List<Control_Info> list = new List<Control_Info>();
            list.Add(new Control_Info { Label_Name = "Test A", Button_Name = "Desc A" });
            list.Add(new Control_Info { Label_Name = "Test B", Button_Name = "Desc B" });
            list.Add(new Control_Info { Label_Name = "Test C", Button_Name = "Desc C" });

            foreach (Control_Info ci in list)
            {
                loadControlToPanel(ci);
            }

        }

        private void loadControlToPanel(Control_Info ci)
        {
            Label label = new Label();
            label.Text = ci.Label_Name;
            label.AutoSize = false;
            flowLayoutPanel1.Controls.Add(label);

            Button button = new Button();
            button.Text = ci.Button_Name;
            button.AutoSize = false;
            button.Click += new EventHandler(buttonClickEvent);
            flowLayoutPanel1.Controls.Add(button);
        }

        private void buttonClickEvent(object sender, EventArgs e)
        {
            Control_Info ci = new Control_Info{ Label_Name = "Test D", Button_Name = "Desc D" };
            loadControlToPanel(ci);
        }
    }
}

使用SetChildIndex(...); 方法,例如:

    Form f5 = new Form();
    FlowLayoutPanel panel = new FlowLayoutPanel { FlowDirection = FlowDirection.TopDown, Dock = DockStyle.Fill };
    f5.Controls.Add(panel);
    Label lbA = new Label { Text = "A" };
    Button btnA = new Button { Text = "A" };
    panel.Controls.Add(lbA);
    panel.Controls.Add(btnA);
    char c = 'B';
    EventHandler action = null; 
    action = (o, e) => {
        int index = panel.Controls.IndexOf((Control) o); // index of button clicked
        Label lbNew = new Label { Text = c.ToString() };
        Button btnNew = new Button { Text = c.ToString() };
        btnNew.Click += action;
        c++;
        panel.SuspendLayout();
        panel.Controls.Add(lbNew);
        panel.Controls.Add(btnNew);
        panel.Controls.SetChildIndex(btnNew, index+1);
        panel.Controls.SetChildIndex(lbNew, index+1);   
        panel.ResumeLayout(true);
    };
    btnA.Click += action;

    Application.Run(f5);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM