【问题标题】:Running two foreach iterations simultaneosly C#同时运行两个 foreach 迭代 C#
【发布时间】:2013-06-06 16:24:17
【问题描述】:

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

代码:

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

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

【问题讨论】:

  • 保留已检查 id 的列表并对其进行迭代?
  • name 是复选框的名称
  • 离题,但我建议将 ITextControl cd 作为 ITextControl,检查空值,然后调用 cd.Text。它可能比反映页面上的每个控件更好。
  • 您的代码易受 SQL 注入攻击。
  • 这些并行如何?

标签: c# .net winforms


【解决方案1】:

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

【讨论】:

  • 感谢您的帮助,但 val 正在存储 cd.Text 并且 cd 使用 text 类型指定,而 c 是复选框。我正在尝试存储已选中关联复选框的文本框的值,此处未声明 cd
  • 是的,现在我明白了。更新了答案
  • 文本框的 foreach 正在复选框的 foreach 下运行。我想在并行迭代中运行两个 foreach,即在同一个循环中而不是两个不同的循环中一起运行。
  • 我认为这是不可能的。如果您需要在更新后立即退出,您可以添加 break 语句
  • 它给出了相同的结果,它在数据库中输入唯一最后一个选中的值的次数与选中的复选框的数量一样多
【解决方案2】:

我会在一个迭代中进行迭代。

循环内循环。

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我试过了,效果很好

      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 的数据库中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-25
        • 1970-01-01
        • 2015-05-26
        • 2014-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多