【问题标题】:checkboxlist selection issue复选框列表选择问题
【发布时间】:2011-04-21 18:19:16
【问题描述】:

有 5 个目标和 5 名员工。每个目标都可以分配给这 5 名员工中的任意数量。所以我为每个目标设置了 5 个 CheckBoxList,每个 CheckBoxList 都有这 5 名员工的姓名作为项目。

我想从数据库中检索为哪些员工分配了哪些目标。我有以下代码:

            List<CheckBoxList> checkboxlists = new List<CheckBoxList>();
            checkboxlists.Add(CheckBoxList1);
            checkboxlists.Add(CheckBoxList2);
            checkboxlists.Add(CheckBoxList3);
            checkboxlists.Add(CheckBoxList4);
            checkboxlists.Add(CheckBoxList5);


            for (int z = 1; z <= checkboxlists.Count; z++)
            {
                SqlCommand check = new SqlCommand("SELECT ISGoal1, ISGoal2,ISGoal3, ISGoal4,ISGoal5 FROM PRM2011_EMPLOYEE_GOAL WHERE EmployeeID = '" + employeeid[z - 1] + "'", con);
                SqlDataReader y = check.ExecuteReader();

                y.Read();

                for (int j = 1; j <= 5; j++)
                {
                    if (null != y && y.HasRows)
                    {
                        string yes_or_no = y["ISGoal" + j].ToString().Trim();
                        if (yes_or_no == "Yes")
                        {
                            checkboxlists[j-1].Items[z-1].Selected = true;

                        }
                        //else checkboxlists[j - 1].Items[z - 1].Selected = false;
                    }
                }

                y.Close();
           }

我的问题是,即使我为员工选择了一个目标,与该特定员工对应的所有复选框都会被选中。为什么会这样?

相应地,如果我在发布的代码中注释掉 else 部分,并且如果未选择任何目标,则与该员工对应的所有复选框都未选中。请帮忙。

【问题讨论】:

  • 问题清楚了吗??还是我需要再澄清一次。?

标签: asp.net checkbox checkboxlist sqlcommand


【解决方案1】:

一些想法:

  1. 让您的 for 循环从 0 变为小于 checkboxlists.Count 以及从 0 变为小于 5。这样您就可以避免在各处处理所有减法。
  2. checkboxlists[j-1].Items[z-1].Selected = true 行上,不应该是checkboxlists[z-1].Items[j-1].Selected = true,因为我假设您正在使用z 来迭代您的CheckBoxLists。

这里已经很晚了,所以我的大脑可能有点模糊,但似乎#2 可能是你的问题。试一试这些想法,如果您仍有问题,我会跟进您。

【讨论】:

  • 嗨 ryan,您的解决方案没有多大帮助。问题仍然存在。如果选择了任何员工的复选框之一,则与该员工相关的所有复选框也会被选中。 :(
【解决方案2】:

你的代码有很多问题,我会告诉你主要问题,然后我会列出你代码的其他缺陷。

造成这种情况的原因是:

方法y.Read();在for循环外的存在。 因为Read(); 的功能是读取数据库中的下一行。所以基本上你的代码读取第一个值,让我们假设该值将是“是”,所以它会导致列表框检查员工,而不是再次调用y.Read();,所以它不会移动到下一行! .. 所以该值保持“是”,因此列表中的所有复选框都将被选中。

解决方案:

只需将y.Read(); 从循环外移到其中即可。

像这样:

        List<CheckBoxList> checkboxlists = new List<CheckBoxList>();
        checkboxlists.Add(CheckBoxList1);
        checkboxlists.Add(CheckBoxList2);
        checkboxlists.Add(CheckBoxList3);
        checkboxlists.Add(CheckBoxList4);
        checkboxlists.Add(CheckBoxList5);


        for (int z = 1; z <= checkboxlists.Count; z++)
        {
            SqlCommand check = new SqlCommand("SELECT ISGoal1, ISGoal2,ISGoal3, ISGoal4,ISGoal5 FROM PRM2011_EMPLOYEE_GOAL WHERE EmployeeID = '" + employeeid[z - 1] + "'", con);
            SqlDataReader y = check.ExecuteReader();


            for (int j = 1; j <= 5; j++)
            {
               y.Read();

                if (null != y && y.HasRows)
                {
                    string yes_or_no = y["ISGoal" + j].ToString().Trim();
                    if (yes_or_no == "Yes")
                    {
                        checkboxlists[j-1].Items[z-1].Selected = true;

                    }
                    //else checkboxlists[j - 1].Items[z - 1].Selected = false;
                }
            }

            y.Close();
       }

代码的额外说明

首先

您需要编辑您的SqlCommand 才能使用SqlParameters

SqlCommand check = new SqlCommand("SELECT ISGoal1, ISGoal2,ISGoal3, ISGoal4,ISGoal5 FROM PRM2011_EMPLOYEE_GOAL WHERE EmployeeID = @EmpID", con);

check.Parameters.AddWithValue("@ImpID", employeeid[z - 1]);

第二

如果您正在尝试构建一个真正的应用程序,那么这是一个非常糟糕的做法。即使您不是真正构建此应用程序,我也不认为这是实践的方式。

for (int j = 1; j <= 5; j++)

您的循环应如下所示:

for (int j = 1; j <= checkboxlists.Count; j++)

第三

使用字符串表示是/否值也是一种不好的做法。您应该为所有ISGoal 列数据库使用DataType BIT。因此,您将在 C# 代码中将局部变量的 DateType 从 string 更改为 bool


第四个

checkboxlists[j-1].Items[z-1].Selected = true;

你应该像 Ryan 说的那样切换,因为z 表示CheckBoxListsj 表示给定CheckBoxList 的项目

所以它可能是这样的:

checkboxlists[z-1].Items[j-1].Selected = true;

N.B:起初我并没有注意,我认为 [z-1] 是某种 LINQ 表达式:D!! ..这是我的错,但我的意思是我刚开始编程时曾经这样做过,但我仍然无法识别它..这不是我认为的最佳实践! .. 我的建议尊重使用的从零开始的编号。


终于

您不必每次都检查 y.Read();是否为空。所以我认为这段代码会更有意义,而且硬编码循环的条件是一种非常糟糕的做法,所以我们将使用一个 while 循环并添加 int 类型的局部变量,然后我们将在我们的循环代码,以便您可以使用它来访问 CheckBoxList 项

                int j = 1;
                while (y.Read())
                {
                        string yes_or_no = y["ISGoal" + j].ToString().Trim();
                        if (yes_or_no == "Yes")
                        {
                            checkboxlists[j-1].Items[z-1].Selected = true;
                            //use our counter "j" here

                        }
                        //else checkboxlists[j - 1].Items[z - 1].Selected = false;
                        //use our counter "j" here
                        j++;
                    }

..祝你好运;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多