【发布时间】:2020-06-11 05:54:54
【问题描述】:
实际上,我对 C# 还是很陌生。我在数据库中有两个表,分别命名为“Categories”和“MenuItems”。我想要的是当表单加载时,我应该从数据库中获取所有类别行并将它们显示为动态生成的按钮上的文本(按钮的数量取决于类别行的数量),我已经使用以下代码完成了它:
private void Form1_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=Shezi;Initial Catalog=RMS;Integrated Security=True";
SqlCommand cmd = new SqlCommand();
con.Open();
string commandText = "select Categories From Categories";
cmd = new SqlCommand(commandText, con);
SqlDataReader sdr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(sdr);
con.Close();
int btnName = 0;
if (dt.Rows.Count>0)
{
btnName++;
int PosY = 5;
int rowCount = -1;
int numOfRows = dt.Rows.Count;
for(int i=0; i<numOfRows; i++)
{
rowCount++;
foreach (DataRow row in dt.Rows)
{
variables.btnText = dt.Rows[rowCount].Field<string>(0);
}
Button button = new Button();
button.Enabled = true;
button.Text = variables.btnText;
button.BackColor = Color.Green;
button.ForeColor = Color.White;
button.Width = 150;
button.Height = 50;
button.Name = "button" + btnName;
button.Location = new Point(-2, PosY);
button.Font = new Font("Georgia", 12);
button.Click += Button_Click;
panel.Controls.Add(button);
PosY += 55;
}
}
}
我上面的代码确实根据数据库中的类别行生成动态按钮,这是我的主要问题,我想要的是当用户单击任何动态生成的按钮时,应该在菜单项中搜索该按钮的文本(显然按钮的文本将是类别文本),应用程序应在 MenuItems 行中搜索该文本并过滤掉针对该类别保存的所有 MenuItems(例如,如果动态生成的按钮具有文本“Burger”,则程序应获取所有菜单汉堡类别中的项目并显示在更多新生成的动态按钮上),类似地,如果单击具有类别奶酪的按钮,它应该获取并创建新的动态按钮并填充奶酪菜单项。 这是我迄今为止尝试根据按钮点击获得新的动态按钮:
private void btn1_Click(object sender, EventArgs e)
{
dt = manager.GetMenuItems(menuItems);
var count = dt.Rows.Count;
//int btnName = 0;
int PosX = 160;
int rowCount = -1;
for (int i = 0; i < count; i++)
{
//btnName++;
rowCount++;
foreach (DataRow row in dt.Rows)
{
menuItems.MenuText = dt.Rows[rowCount].Field<string>(0);
//categories.btnText = row.Field<string>("Categories", DataRowVersion.Original);//do not undo
DataView dv = dt.DefaultView;
dv.RowFilter = "MenuItem = MenuItem";
DataTable dt1 = dv.ToTable();
menuItems.MenuText = dt1.ToString();
}
//string btnText = count.ToString();
Button btn1 = new Button();
btn1.Enabled = true;
btn1.Text = menuItems.MenuText;
btn1.BackColor = Color.Navy;
btn1.ForeColor = Color.White;
btn1.Width = 150;
btn1.Height = 50;
btn1.Name = "btn1";
btn1.Location = new Point(PosX, 10);
btn1.Font = new Font("Georgia", 12);
btn1.Click += new EventHandler(btn1_Click);
pnlCategories.Controls.Add(btn1);
PosX += 150;
//var newvalue = ds.Tables[0].Rows[1].ItemArray[0].ToString();
}
}
我已经搜索了很多方法但找不到类似的东西,我也在 stackoverflow 上尝试了不同的线程但没有运气,需要帮助!
【问题讨论】:
-
MenuItems Table 中有哪些列?
-
使用如下:string[] columnNames = dt.Columns.Cast
().Select(x => x.ColumnName).ToArray();