0

我正在尝试运行两个并行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

4 回答 4

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值的数据库字段是文本类型,因此不需要进行整数转换。

于 2013-06-05T11:15:35.220 回答
1

我会在迭代中进行迭代。

循环内循环。

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

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

于 2013-06-05T11:16:15.453 回答
0

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

var namesOfCheckedBoxes = panel1.Controls.OfType<CheckBox>().Where(cb=>cb.Checked).Select(cb=>cb.Name);
于 2013-06-05T11:16:11.163 回答
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();
        }
    }
}

现在它将值存储在其各自 CheckBox 已选中的 TextBox 的数据库中

于 2013-06-06T08:24:17.757 回答