2013-06-05 36 views
0

我試圖運行兩個平行foreach運行2次的foreach迭代simultaneosly C#

代碼:

foreach (Control c in panel1.Controls) 
{ 
    if (c.GetType() == typeof(CheckBox)) 
    { 
     if (((CheckBox)c).Checked) 
     { 
      id = name; 
     } 
    } 
} 

if (id != "") 
{ 
    foreach (Control cd in panel1.Controls) 
    { 
     if (cd.GetType() == typeof(TextBox) && cd.Name == name) 
     { 
      val = cd.Text.ToString(); 

      if (val != "") 
      { 
       con3.Open(); 
       SqlCommand cmd3 = new SqlCommand("insert into Employee_Ear_Ded values('" + Convert.ToInt32(name) + "','" + Convert.ToInt32(comboBox1.Text) + "','" + drpPayHead.Text + "','" + Convert.ToDouble(val) + "','" + comboBox2.Text + "')", con3); 
       cmd3.ExecuteNonQuery(); 
       con3.Close(); 
      } 
      else 
      { 
       MessageBox.Show("Please Enter Value"); 
      } 
     } 
    } 
} 
else 
{ 
    MessageBox.Show("No Employee Selected"); 
} 

在這裏,我想插入文本框,其相應的複選框的值被選中。
我正在使用的代碼只插入最後一次檢查的值。
如何爲每個複選框及其相應的文本框運行它?
控件在運行時創建。

+0

將選中的ID列表和重複那些TextBox的數據庫中的值? – Carra

+0

什麼是'name'? – yogi

+0

名稱是複選框的名稱 – Hanumendra

回答

0

我想這和它的工作

foreach (CheckBox c in panel1.Controls.OfType<CheckBox>()) 
{ 
if (c.Checked) 
{ 
    var name = c.Name; 
    foreach(TextBox cd in panel1.Controls.OfType<TextBox>()) 
    { 
     string val = cd.Text; 
     if (val != "" && cd.Name == name) 
     { 

      con3.Open(); 
      SqlCommand cmd3 = new SqlCommand("insert into ...", con3); 
      cmd3.ExecuteNonQuery(); 
      con3.Close(); 
     } 
    } 
} 

現在它存儲其相應的複選框被選中

3

你可以僅環比使用可枚舉擴展OfType的複選框,然後在用相同的語法

foreach (CheckBox c in panel1.Controls.OfType<CheckBox>()) 
{ 
    if (c.Checked) 
    { 
     foreach(TextBox cd in panel1.Controls.OfType<TextBox>()) 
     { 
      string val = cd.Text; 
      if (val != "" && cd.Name == name) 
      { 
       con3.Open(); 
       SqlCommand cmd3 = new SqlCommand("insert into ....", con3) 
       cmd3.ExecuteNonQuery(); 
       con3.Close(); 
      } 
     } 
    } 
} 

說,文本框,我真的建議你看看參數化查詢。
您的數據庫命令文本內置串聯字符串值是非常危險的(Sql Injection),如果有輸入字符串

也有一些無效字符,因爲它站在現在的代碼可能會失敗,SQL命令似乎是錯誤的。
該代碼將變量name(字符串)轉換爲整數,然後將結果封裝到單引號中。
這就像是說接收到name值的數據庫字段是文本類型,因此不需要整數轉換。

+0

感謝您的幫助,但val正在存儲cd.Text,並且cd是使用類型文本指定的,而c是複選框。我試圖存儲其關聯複選框被選中的文本框的值,這裏沒有聲明cd – Hanumendra

+0

是的,現在我明白了。已更新答案 – Steve

+0

foreach文本框正在運行在複選框的foreach下。我想在並行迭代中運行這兩個foreach,即一起在同一個循環中,而不是兩個不同的循環。 – Hanumendra

0

我不明白你如何將複選框鏈接到文本框。上層嵌套循環內的「id = name」沒有意義,因爲它不涉及循環變量。我假設你想要一個所有「選中」複選框的列表。這是實現它的一種方法。您可以用相同的方式遍歷TextBoxes來訪問它們的內容。

var namesOfCheckedBoxes = panel1.Controls.OfType<CheckBox>().Where(cb=>cb.Checked).Select(cb=>cb.Name); 
1

我會在迭代中迭代。

環內循環。

另一個也許更好的方法是將複選框的未使用屬性「標記」設置爲相應的文本框控件。

將很容易鏈接兩個對象,並與正確的方法設計您可以保存這兩個迭代。