基于查询返回的数据动态创建控件

时间:2014-10-29 14:46:37

标签: c# winforms textbox label

我正在查询访问表,并且返回的数据我需要能够创建控件。现在我的代码的问题是(我显然需要比我更好地学习循环)代码执行完全如第一个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++;
}

3 个答案:

答案 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”。