同时运行两个foreach迭代C#

时间:2013-06-05 11:07:18

标签: c# .net winforms

我正在尝试运行两个并行的foreach循环

代码:

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");
}

这里我试图插入相应复选框已选中的文本框的值 我正在使用的代码只插入最后检查的值 如何为每个复选框及其相应的文本框运行它? 控件是在运行时创建的。

4 个答案:

答案 0 :(得分:3)

您可以使用Enumerable扩展名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值的数据库字段是文本类型,因此不需要整数转换。

答案 1 :(得分:1)

我会迭代迭代。

循环内圈。

另一种也许更好的方法是将复选框的未使用属性“tag”设置为文本框的相应控件。

链接两个对象非常容易,并且使用正确的方法设计您可以保存两个迭代。

答案 2 :(得分:0)

我看不到你如何将复选框链接到文本框。上层嵌套循环中的“id = name”没有多大意义,因为它不涉及循环变量。我假设你想要一个所有“选中”复选框的列表。这是实现它的一种方法。您可以以相同的方式迭代TextBox,以访问其内容。

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

答案 3 :(得分: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();
        }
    }
}

现在它将值存储在TextBox的数据库中,其中各自的CheckBox是Checked