2016-06-13 4 views
0

現在、私は現在、デスクトップ用のVB.NET expressで作業しています。2013年には、配列を持つループ上でSQLデータをいくつかのdatagridviewにバインドするのが苦労しています。私はオブジェクトのnullエラーを受け取りました。その理由は、直接キャストラインでは、データグリッドビューを引っ張っていないからです。私はタブコントロールツール、タブごとに1つのdatagridviewに複数のdatagridviewsを持っています。ここに私のコードは次のとおりです。DataGridviewのnullエラーを与える直接キャスト

try 
Dim array() As Integer = {"2", "3", "4", "7", "8", "10", "11", "12"} 

     For Each value As Integer In array 
      Dim RelativeDGV = DirectCast(Me.Controls("DataGridLine" & value), DataGridView) 
      Using conn1 As New SqlConnection(connstring) 
       conn1.Open() 
       Using comm1 As New SqlCommand("SELECT LineNumber FROM tableA where LineNumber = @LineNumber", conn1) 
        comm1.Parameters.AddWithValue("@LineNumber", value) 
        Dim dt As New DataTable 
        Dim sql As New SqlDataAdapter(comm1) 
        sql.Fill(dt) 
        RelativeDGV.DataSource = dt 
       End Using 
       conn1.Close() 
      End Using 
     Next 

    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 

RelativeDGV.DataSource = dt 
+1

厳格 '「2」、「3」、「4」は'整数 – Plutonix

+0

@Plutonixではありませんオプションをオンに私はオプションに厳しいなって、それも2、3、4に変更され、コードはまだ私を悩ませています。 – Cheddar

+0

問題を再現できません。あなたが 'Option Infer On'を持っていると仮定すると、' RelativeDGV'は 'DataGridView'型です(そうでなければ' Dim RelativeDGV As DataGridView = DirectCast(.....) ')。 DataGridLine2、DataGridLine3などがすべて存在し、DataGridView型であり、フォームのControlsコレクションのメンバー( 'GroupBox'や他のコンテナ内ではない)ですか? – Blackwood

答えて

1

は、このようなDataGridViewのリストを使用してみてくださいまでエラーがライン

Dim RelativeDGV = DirectCast(Me.Controls("DataGridLine" & value), DataGridView) 

しかし、トリガーdosen't nullのエラーである:

Try 
    Dim array() As DataGridView = {DataGridLine2, DataGridLine3, DataGridLine4, DataGridLine7, DataGridLine8, DataGridLine10, DataGridLine11, DataGridLine12} 
    For Each RelativeDGV As DataGridView In array 
     Dim value As Integer = Regex.Replace(RelativeDGV.Name, "[^0-9]+", String.Empty) 
     'or like this 
     'Dim value As Integer = RelativeDGV.Name.Substring(12, RelativeDGV.Name.Length - 12) 
     Using conn1 As New SqlConnection(connstring) 
      conn1.Open() 
      Using comm1 As New SqlCommand("SELECT LineNumber FROM tableA where LineNumber = @LineNumber", conn1) 
       comm1.Parameters.AddWithValue("@LineNumber", value) 
       Dim dt As New DataTable 
       Dim sql As New SqlDataAdapter(comm1) 
       sql.Fill(dt) 
       RelativeDGV.DataSource = dt 
      End Using 
      conn1.Close() 
     End Using 
    Next 

Catch ex As Exception 
    MsgBox(ex.ToString) 
End Try 
+0

私にもう一度、私はこれを試してみよう。私は、パラメータセクションの "Value"変数の2番目の配列を2から3から4に変更する必要があります。 – Cheddar

+0

これは動作していますが、うまくいかないバグがあります。 – Cheddar

+0

@チェダーそれを聞いてうれしい!あなたは答えのように 'DataGridView'の名前から値を抽出することができます。 –

1

さまざまなD GVコントロールは他のタブにありますが、Me.Controlsにはありません。それらを釣ってキャストするのではなく、あなたが名前を知っているので、それらの配列を繰り返すことができます。また、それぞれの新しい接続を作成する必要があるにもそれぞれのDataTableのを複製しません:

Dim dgvCtrls As DataGridView() = {DataGridLine2, DataGridLine3, DataGridLine4} 

Using conn1 As New SqlConnection(connstring) 
    conn1.Open() 
    Using comm1 As New SqlCommand("SELECT LineNumber FROM...", conn1) 
     ' ... 
     dt.Load(comm1.ExecuteReader()) 
    End Using 

    conn1.Close() 
End Using 

For Each dgv In dgvCtrls 
    dgv.DataSource = dt 
Next 

あなたは、各グリッドが自動的に他の人で行った変更を反映したいいけない場合のみ、8つの、同一のDataTableを必要とするだろう。そのために、テーブルを作成するために、同じ接続上のデータセットを使用します。

Dim SQL = "..." 
Dim dgvCtrls As DataGridView() = {dgv5, dgv2, dgv3,...} 
Dim ds = New DataSet 

Using dbcon As New SqlConnection(SQLConnStr) 
    Using cmd As New SqlCommand(SQL, dbcon) 
     dbcon.Open() 
     For n As Int32 = 0 To dgvCtrls.Count - 1 
      ds.Load(cmd.ExecuteReader, LoadOption.OverwriteChanges, dgvCtrls(n).Name) 
     Next 
    End Using 
End Using 

For Each dgv In dgvCtrls 
    dgv.DataSource = ds.Tables(dgv.Name) 
Next 
関連する問題