1

我在 asp.net 4.0 中创建一个 Web 应用程序

我有一个 Web 表单,其中有一个 ListBox 控件,它在Page_Load事件中添加一个字符串列表。如果我从 ListBox 中选择任何列表项并希望通过使用Listbox.SelectedValue它来计算它,则会Object reference not set to an instance of an objectListbox.SelectedValue.

通过使用“QuickWatch”(在 Visual Studio 2010 中),我做了一些发现,我可以通过给出索引(比如Listbox.Items[2])来获得价值,但是如果我使用Listbox.SelectedValue或,我得到 null 或 -1Listbox.SelectedIndex

我的问题是,为什么 ListBox 控件在选择项目时显示空异常错误,因为此 Listbox 不为空?

4

2 回答 2

3

我假设您将ListBoxon postback 绑定到它DataSource,对吗?那么ListBox就会失去他的SelectedValue(甚至SelectedIndexChanged事件不会被触发)。

相反,您应该仅在初始加载时进行数据绑定并检查IsPostback属性:

C#

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack) 
    {
        // pseudo code: 
        ListBox1.DatSource = GetYourDataSource();
        ListBox1.DataBind();
    }
}

VB.NET

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        ' pseudo code: '
        ListBox1.DatSource = GetYourDataSource()
        ListBox1.DataBind()
    End If
End Sub
于 2012-06-12T19:43:03.660 回答
1

根据我对您在重新填充Listbox.SelectedValue后检查的情况的理解,因此 SelectedIndex 被重置,即。然后你试图在事件处理程序中检查or ,所以它会是.Page_LoadListBox-1SelectedValueSelectedIndex-1

建议:
1. 在第一次Page_Load 时填充ListBox。

protected void Page_Load(object sender, EventArgs e)
{
 if(!IsPostBack) 
  {
    //Bind it once on first time page load
    MyListbox.DatSource = SqlDataSource1();
    MyListbox.DataBind();
  }
}


2. 然后在处理完事件后重新填充MyListBox.
3.您应该制定一种protected填充方法ListBox

注意: “空异常”是由于没有选择项目,即-1(实际上是在 Page_Load 上重置)

于 2012-06-12T20:08:20.047 回答