基于查询返回的数据动态创建控件
本文关键字:数据 动态 创建 控件 返回 于查询 查询 | 更新日期: 2023-09-27 18:28:13
我正在查询访问表,使用返回的数据,我需要能够创建控件。现在,我的代码的问题是(我显然需要比现在更好地了解循环),代码执行得完全正确——第一个foreach循环,然后移动到第二个foreach环路。所以我有所有的标签,然后我有所有文本框。我需要一对一的关系。所以标签文本框。这是我当前的代码,没有产生期望的结果。有人能帮我调整一下吗?以产生标签到文本框的1比1关系的预期结果
System.Collections.Hashtable lookup = new System.Collections.Hashtable();
OleDbConnection olecon = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + oName);
olecon.Open();
OleDbCommand command = new OleDbCommand("Query Data Goes Here", olecon);
OleDbCommand command1 = new OleDbCommand("Query Data Goes Here", olecon);
dr = command.ExecuteReader();
while (dr.Read())
{
labelNames.Add(dr[0].ToString());
}
dr.Close();
dr = command1.ExecuteReader();
while (dr.Read())
{
textboxNames.Add(dr[0].ToString());
}
dr.Close();
foreach (string label in labelNames)
{
Label lbl = new Label();
lbl.Name = "lbl_" + index;
lbl.Text = label;
lbl.AutoSize = true;
Form1.Controls.Add(lbl);
index++;
}
foreach (string textbox in textboxNames)
{
TextBox tbx = new TextBox();
tbx.Name = "txt_" + counter;
tbx.AutoSize = true;
Form1.Controls.Add(tbx);
counter++;
}
我看不到textboxNames
集合有任何用途。你需要的是,将两个foreach
分组,一起创建标签和文本框,并将它们添加到你的表单中,如下面的
foreach (string label in labelNames)
{
Label lbl = new Label();
lbl.Name = "lbl_" + index;
lbl.Text = label;
lbl.AutoSize = true;
Form1.Controls.Add(lbl);
TextBox tbx = new TextBox();
tbx.Name = "txt_" + index;
tbx.AutoSize = true;
Form1.Controls.Add(tbx);
index++;
}
与其将它们作为两个单独的foreach循环进行,不如在一个for循环中进行,例如(假设labelNames和textboxNames为List<string>
):
for (int i = 0; i < labelNames.Count; i++)
{
Label lbl = new Label();
lbl.Name = "lbl_" + labelNames[i];
lbl.Text = labelNames[i];
lbl.AutoSize = true;
Form1.Controls.Add(lbl);
TextBox tbx = new TextBox();
tbx.Name = "txt_" + textboxNames[i];
tbx.AutoSize = true;
Form1.Controls.Add(tbx);
}
同样值得检查的是,作为健全性检查,每个第一个都有相等的数量:
if (labelNames.Count != textboxNames.Count)
{
//throw exception etc.
}
用一个同时遍历两个列表的for循环替换两个foreach循环
for(int i = 0; i < Math.Min(labelNames.Length, textboxNames.Length); i++)
{
Label lbl = new Label();
lbl.Name = "lbl_" + i;
lbl.Text = textboxNames[i];
lbl.AutoSize = true;
Form1.Controls.Add(lbl);
TextBox tbx = new TextBox();
tbx.Name = "txt_" + i;
tbx.AutoSize = true;
Form1.Controls.Add(tbx);
}
"Math.Min(labelNames.Length,textboxNames.Length)"比较器将确保循环在条目最少的列表之后停止。我没有看到你定义的labelNames或textboxNames集合,所以我不确定它们是数组还是列表,所以你可能需要将"Length"更改为"Count"。