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

本文关键字:数据 动态 创建 控件 返回 于查询 查询 | 更新日期: 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"。