2014-10-29 58 views
0

我正在查詢訪問表,並使用返回的數據查詢我需要能夠創建控件。現在我的代碼的問題是(我顯然需要比我更好地瞭解循環)代碼執行完全按照它應該執行的第一個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

我沒有看到任何使用textboxNames集合。你需要的是,將2個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++; 
} 
+0

像@ Rahul的回答說,你的代碼示例並沒有真正強調需要使用第二個查詢來創建文本框。如果您刪除了您認爲與您的問題無關的信息,並且您承諾保留第二個查詢,那麼我認爲這要歸結爲確保您的兩個查詢返回相同數量的記錄。 – 2014-10-29 15:01:01

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

更換你的兩個的foreach有一個for循環迴路通過這兩個列表迭代同時:

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)」比較將確保第l在任何列表中的條目數最少的情況下,停止操作。我沒有看到labelNames或textboxNames集合的定義,因此我不確定它們是數組還是列表或內容,所以您可能需要將「長度」更改爲「計數」。