2012-02-09 103 views
0

我有两个DropDownLists,我试图动态填充/重新填充。在页面加载时,两个DDL都使用来自同一个表中各列的不同值进行填充。当其中任何一个DLL的选定项目发生更改时,我希望其他DDL的内容反映更改(这是为了在以后的GridView上创建一种过滤形式)。未将对象引用设置为对象的实例。 VB.net

下面的代码中的逻辑基本上说,当DDLFirstName被改变时,检查DDLLastName是否已被改变(如果它没有被改变,它应该仍然会说“请选择”)。如果它没有被改变,那么把一个“%”的值放入一个变量中(因此它可以用来表示查询字符串中的ALL),然后清除DDLLastName的内容,这样就可以使用姓氏来重新填充DDLLastName的内容,名字与DDLFirstName所选项目中的名字相同。这需要以其他方式清除它只是增加了新的查询字符串的结果,这是在页面加载

我,但是,收到一个可爱的错误所产生的列表的末尾: 对象引用不设置到对象的实例 当DDLLastName仍在“请选择”时更改DDLFirstName时。

Public Sub DDLFirstName_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DDLFirstName.TextChanged 

      Dim FNvar As String 
      Dim LNlist As ListItem 

      If DDLLastName.SelectedItem.Text = "Please Select" Then 
       FNvar = "%" 
       DDLLastName.Items.Clear() 
      Else 
       FNvar = DDLFirstName.SelectedItem.Text 
      End If 

      Using conn As New SqlConnection() 
       conn.ConnectionString = WebConfigurationManager.ConnectionStrings("TestDBConnectionString").ConnectionString 
       Using cmd As New SqlCommand("SELECT DISTINCT [LastName] FROM [Employees] WHERE [FirstName] LIKE '" & FNvar & "'", conn) 
        conn.Open() 
        Using reader = cmd.ExecuteReader() 
         While reader.Read 
          LNlist = New ListItem() 
          LNlist.Value = reader("LastName") 
          LNlist.Text = reader("LastName") 
          DDLLastName.Items.Add(LNlist) 
         End While 
        End Using 
       End Using 
      End Using 
    End sub 

Page_Load事件:

 Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     Try 

      If Not Page.IsPostBack Then 
       FillFNDLL() 
       FillLNDLL() 
      End If 

     Catch exc As Exception  'Module failed to load 
      ProcessModuleLoadException(Me, exc) 

     End Try 

    End Sub 

    Protected Sub FillFNDLL() 

     Dim FNlist As ListItem 
     Dim sel As New ListItem 
     sel.Text = "Please Select" 
     sel.Value = "*" 
     DDLFirstName.Items.Add(sel) 

     Using conn As New SqlConnection() 
      conn.ConnectionString = WebConfigurationManager.ConnectionStrings("TestDBConnectionString").ConnectionString 
      Using cmd As New SqlCommand("SELECT DISTINCT [FirstName] FROM [Employees]", conn) 
       conn.Open() 
       Using reader = cmd.ExecuteReader() 
        While reader.Read 
         FNlist = New ListItem() 
         FNlist.Value = reader("FirstName") 
         FNlist.Text = reader("FirstName") 
         DDLFirstName.Items.Add(FNlist) 
        End While 
       End Using 
      End Using 
     End Using 

    End Sub 

    Protected Sub FillLNDLL() 

     Dim LNlist As ListItem 
     Dim sel As New ListItem 
     sel.Text = "Please Select" 
     sel.Value = "*" 
     DDLLastName.Items.Add(sel) 

     Using conn As New SqlConnection() 
      conn.ConnectionString = WebConfigurationManager.ConnectionStrings("TestDBConnectionString").ConnectionString 
      Using cmd As New SqlCommand("SELECT DISTINCT [LastName] FROM [Employees]", conn) 
       conn.Open() 
       Using reader = cmd.ExecuteReader() 
        While reader.Read 
         LNlist = New ListItem() 
         LNlist.Value = reader("LastName") 
         LNlist.Text = reader("LastName") 
         DDLLastName.Items.Add(LNlist) 
        End While 
       End Using 
      End Using 
     End Using 

    End Sub 
+1

您是否测试过SQL中的查询,您确定读者没有获得读取器(“LastName”)的NULL值吗?这个错误通常意味着你试图填充一个变量而不检查null,并且它已经收到一个空值。 – 2012-02-09 14:09:59

+0

错误发生在哪条线上? – 2012-02-09 14:13:13

+0

哪一行是你得到的错误? – Etch 2012-02-09 14:13:57

回答

0

使最后一行FillLNDLL()DDLLastName.SelectedIndex = 0。否则,“请选择”选项在呈现和显示时不一定是“选中”的,因此您的DDLLastName.SelectedItemNothing

或者,您也可以设置Dim FNvar As String = "%"在声明它,然后,其余部分为:

If DDLLastName.SelectedItem IsNot Nothing Then 
    If DDLLastName.SelectedItem.Text = "Please Select" Then 
     DDLLastName.Items.Clear() 
    Else 
     FNvar = DDLFirstName.SelectedItem.Text 
    End If 
Else 
    DDLLastName.Items.Clear() 
End If 

缺省FNVar所有可能的匹配,如果DDLLastName实际改变只能由DDLFirstName范围缩小。

就我个人而言,我会使用第一个选项。

+0

那么这个问题现在已经解决了。皮特,你确实是对的,我被混淆为选定的项目似乎被渲染,但其选定的值仍然是空的。我已经选择了为selectindex赋值的第一个选项,现在一切都很顺利。 – Ryan 2012-02-10 09:17:08

0

当你遇到这个错误,做最快的事情就是一步通过逐行执行代码,并找出哪些行引发错误。然后再次逐句通过并在光标到达线时暂停,通过将它们放在手表中或简单地将它们放在它们上面(可以检查线上所有变量以查看哪一个是“无”或“空”对于下拉列表等复杂的数据对象会很棘手)。

如果您认为删除DDLLastName上的清除线修复了错误,那么稍后当您使用DDLLastName(在此函数中或在此函数之后调用另一个函数时)时,您会收到异常试图访问选定的行或此函数清除的内容。

如果您需要更多帮助,请按照上述方式调试代码,直到找出哪个变量为“无”,如果您仍然无法弄清楚,至少会发布异常的堆栈跟踪,所以我们确信该错误至少来自这个函数。

+0

感谢您的建议,我现在就着手并立即发布结果。 – Ryan 2012-02-09 15:34:17

+0

谢谢Jrud,我使用了你的建议,并缩小了发生错误的项目。 – Ryan 2012-02-10 09:10:08

+0

查找导致错误的确切对象应该会让您更好地理解所面临的问题,并且可能会提供有关如何解决问题的线索。 – Jrud 2012-02-13 20:41:01

相关问题