Несоответствие ASP.NET DropDownList между столбцом идентификатора SQL Server и выбранным индексом DDL - PullRequest
0 голосов
/ 10 июня 2019

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

Пользователь должен выбрать незавершенный заказ в раскрывающемся списке, просмотреть информацию о заказе и (с разрешения ассоциированного сотрудника) отправить заказ.Что я заметил, так это то, что если вы удалите заказ из базы данных, которая загружается в 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 здесь и его метод.Этот метод работает так, что он принимает следующие параметры:

  1. Хранимая процедура для выполнения
  2. Строка соединения SQL
  3. Массив строк, которые будутбыть добавленным к хранимой процедуре;в этом случае мне нужно вставить ID, если я собираюсь обновить связанную таблицу, и
  4. Строковые аргументы, которые, как и # 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 с помощью одной команды - и в любом случае такая функция будетв любом случае в этом случае нет необходимости.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Я нашел ошибку и исправил ее.

int bIndex = ddlBootLoanSel.SelectedIndex;

string blNo= ddlBootLoanSel.Items[bIndex].ToString()

или

string blNo= ddlBootLoanSel.SelectedItem.ToString()
0 голосов
/ 11 июня 2019

Основная проблема с этой строкой здесь:

string blNo = ddlBootLoanSel.SelectedIndex.ToString();

SelectedIndex должен фактически быть установлен как SelectedValue или SelectedItem.Value. Он возьмет идентификатор заказа и установит его в раскрывающемся списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...