ASP.NET SQL Server ID 列和 DDL 选定索引之间的下拉列表列表差异



现在我正在开发一个允许员工订购靴子的系统 - 部分流程需要特殊用户的批准才能完全处理订单。

用户应从下拉列表中选择未完成的订单,查看订单信息,然后(经关联员工批准)提交订单。我注意到的是,如果您从加载到 DDL 的数据库中删除订单,或者将订单编辑到没有任何理由加载到 DDL 中的位置,从 DDL 加载的列表项会感到困惑并说"位置 0 处没有行"(请参阅下面的代码)。

其原因是DDL的数据加载到DataTable中的方式 - 然后加载到ListItem中。由于单个贷款的 ID 用于将所有贷款信息加载到数据表中,因此该 ID 还负责在 DDL 中充当贷款的索引。因此,编辑或删除借用会导致 DDL 中出现一个空间,列表项希望被其他内容占用。至少据我所知,这就是错误的来源。

此数据将加载到的面板存在多个元素。在我试图规避"位置 0 处没有行"错误时,我尝试设置一个也等于 DDL 的 SelectedIndex 的整数。从那里,我尝试将该整数插入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 });

如前所述:贷款的 ID 正在加载到数据表中。 我还应该在这里提到 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 - 无论如何,在这种情况下,无论如何,这样的功能是不必要的。

主要问题在于此处的这一行:

string blNo = ddlBootLoanSel.SelectedIndex.ToString();

SelectedIndex 实际上应该设置为 SelectedValue 或 SelectedItem.Value。这将获取订单的 ID 并将其设置在下拉列表中。

我发现了一个错误并修复了它。

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

string blNo= ddlBootLoanSel.SelectedItem.ToString()

最新更新