我正在查询访问表,并且返回的数据我需要能够创建控件。现在我的代码的问题是(我显然需要比我更好地学习循环)代码执行完全如第一个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++;
}
答案 0 :(得分:3)
我没有看到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++;
}
答案 1 :(得分:3)
不是将它们作为2个独立的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.
}
答案 2 :(得分:2)
用一个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”。