У вас много проблем в коде, я расскажу вам основную проблему, а затем перечислю другие недостатки вашего кода.
Что вызывает это:
существование метода 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++;
}
.. Удачи;)