tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルdatagridviewの再表示
記事No8032
投稿日: 2008/08/28(Thu) 10:34
投稿者マリオ
VB2005、SQLServer2005環境です。
FormA、FormBの2つのフォームがあり、FormAはDataGridViewでデータを表示し、
FormBはFormAで選択されたデータを呼び出し修正処理を行っています。
質問は、FormBでデータを登録し、FormBを閉じたタイミングで、
FormAのDataGridViewを再描画して最新のデータを表示したいのですがうまくいきません。

<FormAで記述しているCD>
Private Sub BTN_Data表示ボタン_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles BTN_Data表示ボタン.Click
    'DB接続
    'SQL文を作成して実行
    'データアダプタを生成
    'データセットでバインド
    'DB切断
End Sub

<FormBで記述しているCD>
Private Sub BTN_更新_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_更新.Click
    'FormBの内容を更新する処理
    Me.Close()
End Sub

FormAからFormBをオープンする時に、ShowDialogでオープンしています。
FormBを閉じた時点で FormA 内の FormB.ShowDialog の次の行に制御が戻りますので、
ここで DataGridView をリフレッシュしたのですが出来ませんでした。
    me.datagridview1.refresh()

上記の、FormBが閉じる時のイベントで、ResetBindingsを使えばいいのかと思いましたが
どこにどう記述すればよいかわかりませんでした。
どうすれば再描画できるでしょうか?
ご教授ください。

[ツリー表示へ]
タイトルRe: datagridviewの再表示
記事No8036
投稿日: 2008/08/29(Fri) 09:58
投稿者るしぇ
FormA と FormB でデータを受け渡してるとか、共通して使うような設定の
説明、及びコードが書かれていないので、そもそもどこにあるデータの
何が更新されているのか、されていないのかの判断が出来ません。

データが更新されているのはどうやって確認しましたか?

[ツリー表示へ]
タイトルRe^2: datagridviewの再表示
記事No8037
投稿日: 2008/08/29(Fri) 11:41
投稿者マリオ
コードを記載します。
FormAのBTN_修正ボタンクリック時にrefresh()してエラーでした。

<FormAで記述しているCD>
■DataGridViewへのデータ表示
Private Sub BTN_Data表示ボタン_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_Data表示ボタン.Click
        Dim strsql As String
        Try
            '---DB接続
            Call DBConnect()
            strsql = "SELECT コード, 氏名 FROM Aテーブル ORDER BY コード"
            Dim comm As SqlCommand = New SqlCommand(strsql, Con)
            Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)
            dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
            Dim ds As DataSet = New DataSet()
            dataadapter.Fill(ds, "テーブル")
            DataGridView1.DataSource = ds
            DataGridView1.DataMember = "テーブル"
        Catch oExcept As Exception
            MessageBox.Show(oExcept.ToString, "例外発生")
        Finally
            '---DB切断
            Call Disconnect()
        End Try
End Sub

■DataGridViewのデータを選択しFormBを開く
    Private Sub BTN_修正_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_修正.Click
        Dim f As New FormB()        
        '〜選択された主キーの値を引数で渡す処理〜
        f.ShowDialog()
        f.Dispose()
        '---DataGridViewの再表示
        DataGridView1.refresh()     ←ここでエラー
    End Sub

<FormBで記述しているCD>
■FormBに表示しているデータを登録する
    Private Sub BTN_登録_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_登録.Click
        Dim strsql As String
        Dim Tran As SqlClient.SqlTransaction
        '---DB接続
        Call DBConnect()
        strsql = "SELECT * FROM テーブル"
        Dim comm As SqlCommand = New SqlCommand(strsql, Con)
        Tran = Con.BeginTransaction()
        comm.Transaction = Tran
        Try
            Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)
            Dim ds As DataSet = New DataSet()
            dataadapter.Fill(ds, "テーブル")
            Dim dt As New DataTable
            dt = ds.Tables("テーブル")
            dt.PrimaryKey = New DataColumn() {dt.Columns("コード")}
            Dim targetRow As DataRow
            targetRow = dt.NewRow()
            targetRow = dt.Rows.Find(TXT_コード.Text)
            targetRow("コード") = TXT_コード.Text
            targetRow("氏名") = TXT_氏名.Text
            Dim cb As SqlCommandBuilder = New SqlCommandBuilder(dataadapter)
            dataadapter.Update(ds, "テーブル")
            Tran.Commit()
        Catch oExcept As Exception
            Tran.Rollback()
            MessageBox.Show(oExcept.ToString, "例外発生")
        Finally
            '---DB切断
            Call Disconnect()
        End Try
        Me.Close()
    End Sub

[ツリー表示へ]
タイトルRe^3: datagridviewの再表示
記事No8038
投稿日: 2008/08/29(Fri) 13:35
投稿者るしぇ
まず、言えるのは、FormA と FormB の処理は関係なさそうってこと。
どっちもデータベース接続から切断までやっており、処理として独立
してますから、FormA でバグが起っても FormB が関わっている可能性は
極めて低いし、逆もまた然り。

裏を返せば、FormB でデータを更新しようが、FormA とは関係ない・
影響できないと言ってもいいでしょう。依存度が低くていい設計だと
思います。

で、もう少し言うなら、データベースと FormA(FormB) とも関係ないです。
切断した後は。。。ですが。データベースからデータを取得したら、
切断しているわけですから、ローカルに存在するデータを画面に表示して
います。その後、勝手にデータベースに影響を与えることはありませんし、
データベースの変更を勝手に反映させることもありません。関係ないです。

FormB はデータベースを直接更新してます。しかし、
>ここで DataGridView をリフレッシュしたのですが出来ませんでした。
FormA はデータベースから切断されたローカルのデータを見ているの
ですから、データが更新されないので正解。

Refresh メソッドはコントロールに設定されているデータで画面を
再描画するだけで、切断されたデータベースに勝手につなぎにいったりは
しません。最新のデータを表示したいなら、再度データベースから
データを取得してください。

>DataGridView1.refresh()     ←ここでエラー
これは分かりません。Refresh メソッドでエラーが起こるのは珍しい
ように思います。とりあえず、エラーメッセージに原因が書いてあります。
エラーメッセージでヘルプ(MSDN)を検索すれば、原因と対処法も載って
ます。それに従ってください。

[ツリー表示へ]
タイトルRe^4: datagridviewの再表示
記事No8039
投稿日: 2008/08/29(Fri) 14:33
投稿者マリオ
> FormA はデータベースから切断されたローカルのデータを見ているの
> ですから、データが更新されないので正解。
なるほど。なるほど。
るしぇさんのおかげで理解できました。
すごくわかりやすい説明ありがとうございました。
対処方法ですが、f.ShowDialog()のあとで、再度データセットして表示することで解決できました。

[ツリー表示へ]