проблема выбора списка - PullRequest
       10

проблема выбора списка

0 голосов
/ 19 апреля 2011

Есть 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();
           }

Моя проблема в том, что даже если я выберу одну цель для сотрудника, все флажки, соответствующие этому конкретному сотруднику, будут выбраны. Почему это происходит?

Соответственно, если я закомментирую остальную часть в опубликованном коде, и если какая-либо из целей не будет выбрана, то все флажки, соответствующие этому сотруднику, будут сняты. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011

У вас много проблем в коде, я расскажу вам основную проблему, а затем перечислю другие недостатки вашего кода.

Что вызывает это:

существование метода y.Read(); вне цикла for. поскольку функция Read(); заключается в чтении следующей строки в базе данных. Итак, в основном ваш код читает первое значение. Предположим, что значение будет «Да», поэтому он заставит ListBox проверить работника и вместо повторного вызова 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. и, следовательно, вы измените DateType локальной переменной в вашем коде C # с string на bool.


Четвертый

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

Вы должны переключиться, как сказал Райан, потому что z обозначает элементы CheckBoxLists, а j обозначает элементы данного CheckBoxList

.

так может быть так:

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

Н.Б .: Сначала я не обращал внимания, я думаю [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++;
                    }

.. Удачи;)

0 голосов
/ 19 апреля 2011

Несколько мыслей:

  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 может быть вашей проблемой. Дайте этим мыслям шанс, и я свяжусь с вами, если у вас все еще будут проблемы.

...