Сейчас я работаю над системой, которая позволяла бы сотрудникам заказывать ботинки, и часть процесса требует специального разрешения пользователя для полной обработки заказа.
Пользователь должен выбрать незавершенный заказ в раскрывающемся списке, просмотреть информацию о заказе и (с разрешения ассоциированного сотрудника) отправить заказ.Что я заметил, так это то, что если вы удалите заказ из базы данных, которая загружается в DDL, или вы отредактируете заказ так, чтобы у него не было причин загружаться в DDL, ListItem, который загружается из DDL, будет сбит с толку искажем, что "в позиции 0 нет строки" (см. код ниже).
Причина этого заключается в способе загрузки данных DDL в DataTable, который затем загружается в ListItem.Поскольку идентификаторы для отдельных ссуд используются для загрузки всей информации о ссуде в DataTable, этот идентификатор также несет ответственность за обслуживание в качестве индекса ссуды в DDL.В результате редактирование или удаление ссуды приводит к появлению в DDL пробела, который ListItem ожидает занять чем-то другим.По крайней мере, насколько я могу судить, отсюда и ошибка.
Для панели, в которую будут загружаться эти данные, существует несколько элементов.В моей попытке обойти ошибку «нет строки в позиции 0» я попытался установить целое число, которое также было равно SelectedIndex DDL.Оттуда я попытался вставить это целое число в ListItem, но это привело только к той же самой ошибке - где Visual Studio настаивает, что в этой позиции ничего нет.
После того, как кто-то выбирает что-то в порядке DDL,они должны нажать на кнопку, которая откроет всплывающее окно со всей информацией о заказе.Вот что происходит после появления всплывающего окна:
SqlCommand cmd = new SqlCommand("loanProc", sc);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
string blNo = ddlBootLoanSel.SelectedIndex.ToString();
DataTable dt = CompC.LoadData("loanProc", sc, new string[] { "id" }, new string[] { blNo });
Как уже говорилось ранее: идентификатор для ссуд загружается в таблицу данных.Я должен также упомянуть CompC здесь и его метод.Этот метод работает так, что он принимает следующие параметры:
- Хранимая процедура для выполнения
- Строка соединения SQL
- Массив строк, которые будутбыть добавленным к хранимой процедуре;в этом случае мне нужно вставить ID, если я собираюсь обновить связанную таблицу, и
- Строковые аргументы, которые, как и # 3, будут добавлены в процедуру.Отсюда, CompC.LoadData возьмет результаты процедуры и загрузит их в таблицу.
ListItem li = new ListItem(dt.Rows[0][0].ToString(), dt.Rows[0][8].ToString());
ddlFinFullName.Items.Add(li);
lblFinPartNo.Text = dt.Rows[0][1].ToString();
// Can't use a Boolean here because this code will need to work with SQL Server
if (dt.Rows[0][2].ToString() == "1")
chkFinDiscount.Checked = true;
else
chkFinDiscount.Checked = false;
lblFinACost.Text = dt.Rows[0][3].ToString();
lblFinDesc.Text = dt.Rows[0][4].ToString();
lblFinLastMod.Text = dt.Rows[0][5].ToString();
if (dt.Rows[0][6].ToString() == "")
lblFinAmt.Text = "None";
else
lblFinAmt.Text = dt.Rows[0][6].ToString();
lblFinTP.Text = dt.Rows[0][7].ToString();
if (dt.Rows[0][8].ToString() == "1")
chkFinHF.Checked = true;
else
chkFinHF.Checked = false;
sc.Close();
lblFinID.Text = blNo;
Я ожидаю, что это загрузит всю необходимую информацию для выбранного человека - но вместо этого (еслиэто не ошибка), появляется всплывающее окно с неправильным именем человека, если только выбранный человек не находится в индексе на один номер ниже номера ссуды, которая была удалена.В оставшейся части этого сеанса (опять же: при условии, что всплывающее окно не содержит ошибок), имя одного неверного человека всегда будет появляться во всплывающем окне всякий раз, когда я открываю всплывающее окно для любого другого человека.Я также подумал, что, возможно, была проблема с тем, что ListView не обновлялся каждый раз, когда нажималась кнопка инициативы, но я обнаружил, что нет никакого способа очистить ListView с помощью одной команды - и в любом случае такая функция будетв любом случае в этом случае нет необходимости.