(ASP.NET)将当前选定的Asp:Listbox项存储为字符串

qgelzfjb  于 2022-12-05  发布在  .NET
关注(0)|答案(1)|浏览(196)

我试图将Asp:Listbox中当前选定项的文本存储在变量中。该值总是存储为空值,或者我收到错误消息"System. NullReferenceException:'对象引用未设置为对象的示例。'"
下面的列表框声明

<asp:ListBox ID="lbModules" runat="server" AutoPostBack="true" OnSelectedIndexChanged="lbModules_SelectedIndexChanged" ></asp:ListBox>

SelectedIndex的代码已在下面更改'

protected void lbModules_SelectedIndexChanged(object sender, EventArgs e)
        {
            string code = lbModules.SelectedItem.Text;        
            int week = 1;
            UpdateTextBox(week, code);
        }

'列表框在其他地方被一个方法填充,该方法循环并使用listbox.items.add添加值
我试过listbox.SelectedItem.Text, listbox.SelectedValue.Text, listbox.SelectedItem.Value, listbox.SelectedValue.Value,
Nothing I try返回选定值的文本,总是抛出异常或返回null。

yc0p9oo0

yc0p9oo01#

好了,首先,使用选定的索引更改事件没有多大意义,除非您有autopostback=true。
所以,如果用户要在文本框中输入一些信息等,然后用户说点击你的提交按钮,那么我真的不确定使用选定的索引更改事件的任何价值。
因此,该标记:

<h2>Select Hotels</h2>
        <asp:ListBox ID="ListBox1" runat="server" AutoPostBack="true"
            DataValueField="ID"
            DataTextField="HotelName" 
            OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"
            Width="190px" Height="160px" >
        </asp:ListBox>

        <h3>Selected value</h3>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

和代码背后:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadData();
    }

    void LoadData()
    {
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            string strSQL = 
                "SELECT ID,HotelName FROM tblHotelsA ORDER BY HotelName";
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                conn.Open();
                DataTable rstData = new DataTable();
                rstData.Load(cmdSQL.ExecuteReader());
                ListBox1.DataSource = rstData;
                ListBox1.DataBind();
            }
        }
    }

    protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ListBox1.SelectedIndex >= 0)
        {
            TextBox1.Text = ListBox1.SelectedItem.Value;
            TextBox2.Text = ListBox1.SelectedItem.Text;
        }
    }

请注意,我们只加载列表框一次。因为对于页面上的任何事件触发器,加载时的事件首先触发,然后您为给定的按钮或事件编写存根。因此,如果您加载了lb、网格或实际上“任何”数据,但没有包括所有重要的if!IsPostBack代码存根?
那么你就不能真正建立一个工作的网页!!!(所以,我最近建立的200多个网页都有并且总是有真实的的第一页加载,因为正如所指出的,加载事件总是在回发时触发。所以,如果你再次加载lb或任何东西,它会爆炸并覆盖你所做的选择)。
所以,以上结果是这样的:

然而,如果用户要输入数据,选择内容,然后点击提交按钮,那么当然你可能会删除autopostback = true。并将上述代码放在按钮单击之后,而不是使用选定的索引更改事件。
即使您使用代码将项目添加到lb中,上述规则仍然适用。
因此,请输入以下列表框:

<h2>Select Hotels</h2>
        <asp:ListBox ID="ListBox1" runat="server" AutoPostBack="true"
            OnSelectedIndexChanged="ListBox1_SelectedIndexChanged"
            Width="190px" Height="160px" >
        </asp:ListBox>

        <h3>Selected value</h3>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <br />
        <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

我们仍然需要自动回发,因此下面的代码:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadData();
    }

    void LoadData()
    {

        for (int i = 1; i <= 6; i++)
        {
            string MyText = "Item # " + i;
            ListBox1.Items.Add(new ListItem(MyText, i.ToString()));
        }
    }

    protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (ListBox1.SelectedIndex >= 0)
        {
            TextBox1.Text = ListBox1.SelectedItem.Value;
            TextBox2.Text = ListBox1.SelectedItem.Text;
        }
    }

现在我们看到了:

因此,要么你错过了自动回发,要么你每次回发时都要重新运行代码来填充lb,这将如前所述地取消用户所做的任何选择。

相关问题