当单击 dropdownlist.item.insert 作为下拉列表上的空位置时,在下拉列表上选择索引更改时,行/列的数据不存在
Posted
技术标签:
【中文标题】当单击 dropdownlist.item.insert 作为下拉列表上的空位置时,在下拉列表上选择索引更改时,行/列的数据不存在【英文标题】:Data does not exist for row/column when selectindexchange on Dropdownlist when clicked on dropdownlist.item.insert as empty position on dropdownlist 【发布时间】:2022-01-21 06:20:24 【问题描述】:当我在 DropDownList.Item.Insert 创建的 Dropdownlist 上选择其他(空)位置时,整个应用程序被终止。
if (!Page.IsPostBack)
DropDownList4.Items.Add(new ListItem("", ""));
DropDownList4.AppendDataBoundItems = true;
String strConnString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Projects\projects.accdb";
String strQuery = "select * from projects";
OleDbConnection con = new OleDbConnection(strConnString); ;
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.Connection = con;
try
con.Open();
DropDownList4.DataSource = cmd.ExecuteReader();
DropDownList4.DataTextField = "Project_name";
DropDownList4.DataValueField = "ID";
DropDownList4.DataBind();
catch (Exception ex)
throw ex;
finally
con.Close();
con.Dispose();
protected void DropDownList4_SelectedIndexChanged(object sender, EventArgs e)
String strConnString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Projects\projects.accdb";
string strQuery = "select * from projects where" + " ID = @ID";
OleDbConnection con = new OleDbConnection(strConnString);
OleDbCommand cmd = new OleDbCommand();
cmd.Parameters.AddWithValue("@ID", DropDownList4.SelectedItem.Value);
cmd.CommandType = CommandType.Text;
cmd.CommandText = strQuery;
cmd.Connection = con;
OleDbDataReader myreader;
try
con.Open();
myreader = cmd.ExecuteReader();
myreader.Read();
TextBox12.Text = myreader["Project_name"].ToString();
TextBox2.Text = myreader["Owner"].ToString();
myreader.Close();
finally
con.Close();
我认为原因是 DB 中不存在空值(但它只是由 DropDownList4.Items.Add(new ListItem("", "")) 每次在 Page_load 上创建的)。如何排除在DropDownList上检查DB的第一个空位置?
已编辑:
...
cmd.CommandText = strQuery;
cmd.Connection = con;
try
con.Open();
DropDownList4.DataSource = cmd.ExecuteReader();
if (DropDownList4.SelectedItem.Value == null || DropDownList4.SelectedItem == null)
DropDownList4.DataTextField = "Project_name";
DropDownList4.DataValueField = "ID";
DropDownList4.DataBind();
还是不行
已编辑:
string selected = DropDownList4.SelectedItem.Text;
if (string.IsNullOrEmpty(selected))
现在 - 它正在工作:)
【问题讨论】:
您可以尝试调试问题吗? 可能检查 DropDownList4.SelectedItem 是否为 null 或 DropDownList4.SelectedItem.Value 是否为 null 或任何空值,如果是则返回。 "System.InvalidOperationException HResult=0x80131509 消息=行/列不存在数据" 空列表项是干什么用的?是的,在您从第二个块中的数据库读取之前,您应该检查用户是否没有选择空项目。在这种情况下,将文本框更新为空白。 【参考方案1】:您需要(并且想要)在填写下拉列表后添加空白下拉行。
所以,假设我们有这个标记:
<asp:DropDownList ID="DropDownList1" runat="server"
Height="26px" Width="207px" AutoPostBack="True"
OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"
DataValueField="ID"
DataTextField="HotelName"
>
</asp:DropDownList>
而且我确实建议您将 DataValue/Text 设置放在控件中 - 将代码放在后面的代码中确实没有必要或优势。
而且我们不需要(或不想)每次都重新加载或重新插入额外的空白下拉选项 - 所以只加载一次下拉列表(您尝试的页面加载中的 PostBack = false 是正确的) .
因此,我们将选择一家酒店,然后拉出该 ONE 数据库行以获取更多信息 - 像您的代码示例一样塞入几个文本框中。
我建议这个代码:
protected void Page_Load(object sender, EventArgs e)
if (!IsPostBack)
string strSQL =
"SELECT ID, HotelName FROM tblHotels ORDER BY HotelName";
OleDbCommand cmdSQL = new OleDbCommand(strSQL);
DropDownList1.DataSource = MyRstP(cmdSQL);
DropDownList1.DataBind();
DropDownList1.Items.Insert(0, new ListItem("- Select.. -", "0"));
DataTable MyRstP(OleDbCommand cmdSQL)
DataTable rstData = new DataTable();
using (OleDbConnection conn = new OleDbConnection(Properties.Settings.Default.AccessDB))
cmdSQL.Connection = conn;
using (cmdSQL)
conn.Open();
rstData.Load(cmdSQL.ExecuteReader());
return rstData;
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
string HotelPK = DropDownList1.SelectedItem.Value as string;
string strSQL = "SELECT * FROM tblHotels where ID = @ID";
OleDbCommand cmdSQL = new OleDbCommand(strSQL);
cmdSQL.Parameters.Add("@ID", OleDbType.Integer).Value = HotelPK;
DataTable rstData = MyRstP(cmdSQL);
if (rstData.Rows.Count > 0)
DataRow OneRow = rstData.Rows[0];
TextBox1.Text = OneRow["HotelName"].ToString();
txtTaxRate.Text = OneRow["HotelTax"].ToString();
我们还假设 AutoPostBack = true 以便在我们每次更改下拉列表时触发它。
【讨论】:
以上是关于当单击 dropdownlist.item.insert 作为下拉列表上的空位置时,在下拉列表上选择索引更改时,行/列的数据不存在的主要内容,如果未能解决你的问题,请参考以下文章
jQuery在单击对象时为对象设置动画,当单击主体时,再次设置动画
当用户在菜单外单击时,如何关闭 Bootstrap 导航栏下拉菜单?