DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データセットの別フォームでの表示

環境/言語:[Win2000 VB.Net Framework1.1]
分類:[.NET]

お世話になっております。

下記の条件を満たすようなアプリを作成しようと思っています。

SQLサーバーからDataGridを使用して参照します。
そのDataGridのセルをダブルクリックすると、別フォームを立ち上げそこに
ダブルクリックされたデータを表示し編集出来るようにしたいです。
(Tabコントロールを使用し、各TabごとにDataGridを貼り付け、SQLサーバーからの
抽出をおのおののDataGridに表示する)
※別フォームへのDataSetなどの渡し方がわからなかったのでpublicで宣言して使用しています。
質問なのですが、現在おのおののDataGridに表示し、セルをダブルクリックしたときのDataGridとセルの位置は判別できるのですが、別フォームにアクセスした時にどのデータ
セットを使用するかわからなくなってしまいます。どうやって判断したらよいでしょうか?(下記の方法だと、最後に抽出したデータに対しては表示可能なのですが、別Tabを選択するとエラーとなってしまいます)
また、このようなことを行う方法でなにかいいサンプルなどございましたらお教えいただけないでしょうか。

以下ソース============================================================
Module:
Public SqlDataSet As DataSet
Public SqlDataAdapter As SqlClient.SqlDataAdapter
Public DataSetName() As String
Public DataSetCnt As Integer

FormA:
  Private DbGrid() As System.Windows.Forms.DataGrid

Dim currentDbGrid As DataGrid = DirectCast(sender, DataGrid)
Dim i As Integer
Dim currentCell As DataGridCell = currentDbGrid.CurrentCell
Dim rno As Integer = currentCell.RowNumber
Dim cno As Integer = currentCell.ColumnNumber
Dim frm_ViewB As New frm_ViewB
Dim bmb As BindingManagerBase = currentDbGrid.BindingContext(currentDbGrid.DataSource, currentDbGrid.DataMember)
Dim dr As DataRow = CType(bmb.Current, DataRowView).Row

frm_ViewB.Label4.Text = currentDbGrid.Tag & ":" & rno & ":" & cno
'これはどの行列を示しているかラベルに渡してます
frm_ViewB.ShowDialog(Me)

FormB:
Private myDataSetCnt As Integer
Private myRowNumber As Integer
Private drow As DataRow

Private Sub frm_ViewB_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
dim myA as string
dim myB as string
dim myC as string
Dim myArray As Array
Try
myArray = Split(Me.Label4.Text, ":")
myDataSetCnt = myArray(0)
myRowNumber = myArray(1)

drow = SqlDataSet.Tables(DataSetName(myDataSetCnt)).Rows.Item(myRowNumber)
myA = drow("A")
myB = drow("B")
myC = drow("C")
TextBox1.Text = myA
TextBox2.Text = myB
TextBox3.Text = myC
Catch ex As Exception
Me.Close()
End Try
End Sub
=====================================================================
お世話になります。

■No13431に返信(りょうさんの記事)
> SQLサーバーからDataGridを使用して参照します。
> そのDataGridのセルをダブルクリックすると、別フォームを立ち上げそこに
> ダブルクリックされたデータを表示し編集出来るようにしたいです。

上記要件のみ満たすのであれば、こんな感じでしょうか?

=================================
親画面
=================================
Private Sub Form1_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) _
            Handles MyBase.Load
  'SqlServerからDataSetを取得して
  'DataGridにバインドする
End Sub

Private Sub DataGrid1_DoubleClick(ByVal sender As Object, _
                 ByVal e As System.EventArgs) _
                 Handles DataGrid1.DoubleClick
  Dim child As ChildForm
  child = New ChildForm(DirectCast(Me.DataGrid1.DataSource, DataSet), _
             Me.DataGrid1.CurrentRowIndex)
  child.ShowDialog(Me)
End Sub

=================================
子画面
=================================
Private m_ds As DataSet
Private m_index As Integer

Public Sub New(ByVal ds As DataSet, ByVal index As Integer)
  Me.New()
  Me.m_ds = ds
  Me.m_index = index
End Sub

Private Sub ChildForm_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) _
            Handles MyBase.Load
  Me.TextBox1.Text = CType(Me.m_ds.Tables("テーブル名").Rows(Me.m_index)("項目名"), String)
End Sub
お世話になります。

なおこさん、お返事ありがとうございます。

■No13433に返信(なおこ(・∀・)さんの記事)
> お世話になります。
> 上記要件のみ満たすのであれば、こんな感じでしょうか?
>
> =================================
> 親画面
> =================================
> Private Sub DataGrid1_DoubleClick(ByVal sender As Object, _
>                  ByVal e As System.EventArgs) _
>                  Handles DataGrid1.DoubleClick
>   Dim child As ChildForm
>   child = New ChildForm(DirectCast(Me.DataGrid1.DataSource, DataSet), _
>              Me.DataGrid1.CurrentRowIndex)
>   child.ShowDialog(Me)
> End Sub

上記のコードを実行したところ、New ChildFormの箇所で「追加情報 : 指定されたキャストは有効ではありません。」となってしまいます。名前などは上記に合わせています。

よろしくお願いいたします。
お世話になります。

■No13435に返信(りょうさんの記事)
> 上記のコードを実行したところ、New ChildFormの箇所で「追加情報 : 指定されたキャストは有効ではありません。」となってしまいます。名前などは上記に合わせています。

親画面のLoadはこんな感じになってますか?
多分、DirectCast(Me.DataGrid1.DataSource, DataSet)で失敗しているんでしょう…。


Private Sub Form1_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) _
            Handles MyBase.Load
  Dim SqlConn As SqlClient.SqlConnection

  Try
    SqlConn = New SqlClient.SqlConnection
    SqlConn.ConnectionString = "接続文字列"
    SqlConn.Open()

    Dim selectCmd As SqlClient.SqlCommand = New SqlClient.SqlCommand
    selectCmd.Connection = SqlConn
    selectCmd.CommandText = "SELECT * FROM テーブル名"

    Dim ds As DataSet = New DataSet
    Dim da As SqlClient.SqlDataAdapter
    Dim dt As DataTable

    da = New SqlClient.SqlDataAdapter
    da.SelectCommand = selectCmd
    da.Fill(ds, "テーブル名")

    Me.DataGrid1.DataSource = ds
    Me.DataGrid1.DataMember = "テーブル名"

  Catch ex As Exception
    Console.WriteLine(ex.StackTrace)
  Finally
    If Not SqlConn Is Nothing Then
      SqlConn.Close()
      SqlConn.Dispose()
    End If
  End Try

End Sub
2005/10/24(Mon) 17:52:44 編集(投稿者)
2005/10/24(Mon) 17:52:37 編集(投稿者)

お世話になります。

下記のソースを実行したところちゃんと動作しました。
こちらで作成したものと見比べてみたところ、「Me.DataGrid1.DataSource = ds」
のdsの値をDataSetではなくてDataViewとしていました。

ありがとうございました。

■No13437に返信(なおこ(・∀・)さんの記事)
> お世話になります。
>
> Private Sub Form1_Load(ByVal sender As Object, _
>             ByVal e As System.EventArgs) _
>             Handles MyBase.Load
>   Dim SqlConn As SqlClient.SqlConnection
>
>   Try
>     SqlConn = New SqlClient.SqlConnection
>     SqlConn.ConnectionString = "接続文字列"
>     SqlConn.Open()
>
>     Dim selectCmd As SqlClient.SqlCommand = New SqlClient.SqlCommand
>     selectCmd.Connection = SqlConn
>     selectCmd.CommandText = "SELECT * FROM テーブル名"
>
>     Dim ds As DataSet = New DataSet
>     Dim da As SqlClient.SqlDataAdapter
>     Dim dt As DataTable
>
>     da = New SqlClient.SqlDataAdapter
>     da.SelectCommand = selectCmd
>     da.Fill(ds, "テーブル名")
>
>     Me.DataGrid1.DataSource = ds
>     Me.DataGrid1.DataMember = "テーブル名"
>
>   Catch ex As Exception
>     Console.WriteLine(ex.StackTrace)
>   Finally
>     If Not SqlConn Is Nothing Then
>       SqlConn.Close()
>       SqlConn.Dispose()
>     End If
>   End Try
>
> End Sub
>
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板