2012-02-09 67 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

相關問題