2012-02-09 4 views
0

동적으로 채우거나 다시 채우려는 두 개의 DropDownLists가 있습니다. 페이지로드시 두 DDL 모두 동일한 테이블의 각 열의 고유 한 값으로 채워집니다. 두 DLL 중 선택한 항목이 변경된 경우 변경 사항을 반영하기 위해 다른 DDL의 내용을 원합니다 (GridView에서 필터링의 양식을 만드는 것입니다).개체 참조가 개체의 인스턴스로 설정되지 않았습니다. VB.net

아래 코드의 논리는 기본적으로 DDLFirstName이 변경되면 DDLLastName이 이전에 변경되었는지 확인합니다 (변경되지 않은 경우 "선택하십시오"라고 표시해야 함). 변경되지 않은 경우 "%"값을 변수에 넣으십시오 (쿼리 문자열에 ALL을 말하기 위해 사용할 수 있음). 그런 다음 DDLLastName의 내용을 지우면 마지막 이름으로 다시 채울 수 있습니다. 이름은 DDLFirstName 선택한 항목의 이름과 같습니다. 이 옵션을 선택하지 않으면 페이지로드시 생성 된 목록 끝에 새 쿼리 문자열의 결과가 추가됩니다.

그래도 멋진 오류가 발생합니다. 개체 참조가 개체의 인스턴스 DDLLFirstName을 변경하는 동안 DDLLastName은 여전히 ​​"선택하십시오"에 있습니다.

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에서 쿼리를 테스트 해봤습니까? 독자가 독자 ("성")에 NULL 값을 가져 오지 않았는지 확인하십시오. 이 오류는 일반적으로 null을 확인하지 않고 변수를 채우려고 시도했음을 의미하며 null 값을 받았습니다. –

+0

오류가 발생한 줄은 무엇입니까? –

+0

어떤 라인에서 오류가 발생합니까? – Etch

답변

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 

하는 기본값 FNVarDDLLastName 실제로 변경 한 경우에만 DDLFirstName하여 좁혀.

개인적으로는 첫 번째 옵션을 사용합니다.

+0

이제는이 문제가 해결되었습니다. 피트, 당신은 정말로 옳았습니다. 선택된 항목이 렌더링 된 것처럼 보이지만 그 선택된 값이 실제로는 null 인 것처럼 나는 혼란스러워했습니다. selectindex에 값을 할당 할 때 첫 번째 옵션을 선택했으며 이제는 모두 잘되었습니다. – Ryan

0

라인으로 코드 라인을 통해 단계가 어느 선 것은 오류를 던지고있다 알아. 그런 다음 다시 한 번 건너 뛰고 커서가 줄에 오면 일시 중지합니다. 줄에 사용 된 모든 변수를 확인하여 시계에 넣거나 간단하게 마우스를 올리면 어느 것이 "무효"인지 "널"인지 확인할 수 있습니다. 드롭 다운 목록과 같은 복잡한 데이터 객체로는 까다로울 수 있습니다.)

DDLLastName의 선을 제거하면 오류가 수정된다고 말하면 나중에 나중에이 함수에서 DDLLastName (이 함수 또는이 함수 다음에 호출되는 다른 함수)을 사용할 때 예외가 발생한다고 말합니다 선택한 행이나이 함수가 지우는 대상에 도달하려고합니다.

더 많은 도움이 필요하면 위에서 언급 한 코드를 디버깅하여 "아무것도"찾을 수 없을 때까지 디버그 해보십시오. 그래도 알아낼 수 없으면 예외 스택 추적을 게시해야합니다. 오류는 적어도이 기능에서 발생합니다.

+0

조언을 주셔서 감사합니다. 지금 당장이 결과를 게시하겠습니다. – Ryan

+0

감사합니다 Jrud, 귀하의 조언을 사용하고 오류를 제공하는 항목의 범위를 좁혔습니다. – Ryan

+0

오류의 원인이되는 정확한 개체를 찾는 것은 직면 한 문제를 훨씬 잘 이해하고 해결 방법에 대한 단서를 제공 할 것입니다. – Jrud

관련 문제