当单击 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 导航栏下拉菜单?

当用户单击页面正文的其他位置时隐藏 nabber [关闭]

当 RadioButton 单击 Listview 时 setOnItemClickListener 不起作用

Vue.js:当用户单击链接时如何更改类?

当用户单击侧导航中的按钮时显示数据 - html