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;
}
当我想向动态创建的标签页添加控件时遇到问题。我的软件是餐厅的 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;
}