C# winforms 给动态创建的标签页添加控件

C# winforms add controls to dynamic created tabpages

当我想向动态创建的标签页添加控件时遇到问题。我的软件是餐厅的 POS 系统。我的想法是首先创建餐厅区域和区域有不同数量的桌子。示例:餐厅区域有 15 个桌子,咖啡吧区域有 22 个桌子。在这种情况下,区域中的类别和产品之类的东西都有桌子。为此,我使用 tabcontrol 组件!所有 tabpages 都是区域名称,tabpage 内容必须是桌面显示为 buttons...

所有区域和服务台都存储在 MySql 数据库中。

因此,如果选择 tab_1(区域 #1)作为内容循环,则页面上的所有桌面 buttons

我的代码一直return只有一张桌子,但我有 10 张桌子用于区域 1..

地区列表代码:

private void RegionList()
{
    try
    {
        using (var conn = new MySqlConnection(Properties.Settings.Default["connectionstring"].ToString()))
        {
            conn.Open();
            using (MySqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "SELECT * FROM regions";
                MySqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    TabPage tabPage = new TabPage();
                    string name = reader["name"].ToString();
                    int id = Convert.ToInt32(reader["id"]);

                    tabPage.Name = "tab_" + id;
                    tabPage.Text = name;

                    foreach (var desk in DeskList(id))
                    {
                        tabPage.Controls.Add(desk);
                    }
                    tabControl1.TabPages.Add(tabPage);
                }
                reader.Close();
            }
            conn.Close();
        };
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

这里是列出特定区域服务台的代码:

private List<Button> DeskList(int regionID)
{
    List<Button> desks = new List<Button>();

    try
    {
        using (var conn = new MySqlConnection(Properties.Settings.Default["connectionstring"].ToString()))
        {
            conn.Open();

            using (MySqlCommand cmd = conn.CreateCommand())
            {
                cmd.CommandText = "SELECT * FROM desks WHERE region_id = @id";
                cmd.Parameters.AddWithValue("id", regionID);

                MySqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Button btn = new Button();
                    string name = reader["name"].ToString();

                    btn.Text = name;
                    btn.Name = "desk_" + reader["id"];
                    btn.Size = new Size(100, 60);

                    desk.Add(btn);

                }
                reader.Close();
            };
            conn.Close();
        };
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    return desks;
}

所以当我循环这个时,我在所有区域只得到 1 个桌子,但结果是正确的。所有区域至少有 10 个办公桌。我做错了什么?可能我的方法错了

我认为之前关于按钮位置的说法可能是问题所在。尝试添加以下内容,这将更改每个按钮的位置。

        int i = 0;
        while (reader.Read())
        {
            Button btn = new Button();
            string name = reader["name"].ToString();

            btn.Text = name;
            btn.Name = "desk_" + reader["id"];
            btn.Size = new Size(100, 60);
            btn.Location=new Point(100, 100+i);

            desk.Add(btn);
            i += 10;
        }