同时运行两个foreach迭代c#

本文关键字:两个 foreach 迭代 运行 | 更新日期: 2023-09-27 18:16:56

我正在尝试运行两个并行的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");
}

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

同时运行两个foreach迭代c#

您只能使用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注入),如果输入字符串

中有一些无效字符,则可能失败。

而且,从现在的代码来看,sql命令似乎是错误的。
该代码将变量name(一个字符串)转换为一个整数,然后将结果括在单引号中。
这就好比说,接收name值的数据库字段是文本类型的,因此不需要进行整数转换。

我会在迭代中迭代。

循环内循环。

另一种可能更好的方法是将checkbox的未使用属性"tag"设置为文本框的相应控件。

将很容易链接两个对象,并且通过正确的方法设计,您可以保存两个迭代

我不知道你是如何将复选框链接到文本框的。上层嵌套循环中的"id=name"没有什么意义,因为它不涉及循环变量。我假设您想要一个包含所有"已选中"复选框的列表。这是实现它的一种方法。你可以用同样的方法遍历textbox来访问它们的内容。

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

我试了一下,它工作了

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