2012-02-09 23 views
0

私は、動的に移入/再投入しようとしている2つのDropDownListsを持っています。ページのロード時には、両方のDDLが、同じテーブルの各列の異なる値で埋められます。いずれかのDLLに選択した項目が変更された場合、変更を反映するために他のDDLの内容が必要です(これは後でGridViewでフィルタリングのフォームを作成するためです)。オブジェクト参照がオブジェクトのインスタンスに設定されていません。 VB.net

以下のコードでは、DDLFirstNameが変更されたときにDDLLastNameが以前に変更されているかどうかを確認します(変更していない場合は「Please Select」と表示されます)。それが変更されていない場合、 "%"の値を変数に入れて(つまり、クエリ文字列で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でクエリをテストしましたが、読者がリーダー( "LastName")の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

、行うには最速のものは、線でコード行をステップ実行し、エラーをスローしているラインを把握です。それから、もう一度ステップを実行して、カーソルがラインに移動したらすぐに一時停止し、行に使用されているすべての変数をチェックして、「nothing」または「null」を確認します。ドロップダウンリストなどの複雑なデータオブジェクトでは扱いにくい)。

DDLLastNameのクリアラインを取り除くとエラーが修正されたとすると、DDLLastName(この関数またはこの関数の後に呼び出される別のもの)を使用すると、後で例外が発生する選択された行またはこの関数がクリアするものを取得しようとしています。

もっと助けが必要な場合は、上記のようにコードをデバッグして、「何もない」変数を見つけ出すまで、それを理解できない場合は、例外のスタックトレースを少なくとも投稿してくださいエラーは少なくともこの機能から来ています。

+0

アドバイスをいただき、ありがとうございます。私はこれを今すぐ取り上げ、結果をすぐに掲載します。 – Ryan

+0

ありがとうJrud、私はあなたの助言を使用し、エラーを出す項目を絞り込んだ。 – Ryan

+0

エラーの原因となる正確なオブジェクトを見つけることで、直面している問題をよりよく理解でき、おそらくそれを修正する方法についての手掛かりを得ることができます。 – Jrud

関連する問題