C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 別スレッドで作成されたデータをグリッドに表示させる方法


(過去ログ 42 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■21969 / inTopicNo.1)  別スレッドで作成されたデータをグリッドに表示させる方法
  
□投稿者/ 開発者駆け出し (5回)-(2008/07/14(Mon) 10:33:22)

分類:[.NET 全般] 

お世話になります。

環境
ソフト:VB.NET2003
OS:XP Pro SP2

フォームロード後、ボタンクリックイベントでスレッドを作成、開始して
スレッド内でグリッドに表示するデータを作成しデータテーブルに設定しています。
作成されたデータを

DataDG.DataSource = cdt

のようにデータグリッドに格納しようとすると
「あるスレッドで作成されたコントロールに対してイ、別のスレッドのコントロールを親にすることはできません。」
とエラーが出てしまいます。
ネットでInvokeを使ったやり方が記載されていたので、それに沿った修正を加えてみたのですが、
問題が解消されません。以下のように修正しました。

    Private Delegate Sub ViewDataDelegate(ByVal cdt As DataTable)

  Ptivate mdtGrid as DataTable

    Private Sub ViewDG(ByVal cdt As DataTable)
        Try
            DataDG.DataSource = Nothing
            DataDG.DataSource = cdt
        Catch ex As Exception

        End Try
    End Sub

    Private Sub DispInTable()
        Dim ViewDataGrid As ViewDataDelegate
        Try
           ' データグリッドに表示
            ViewDataGrid = AddressOf ViewDG
            ViewDataGrid.Invoke(mdtGrid)

        Catch ex As Exception
            Throw ex
        Finally
       End Try
    End Sub

ご教授お願い致します。

引用返信 編集キー/
■21970 / inTopicNo.2)  Re[1]: 別スレッドで作成されたデータをグリッドに表示させる方法
□投稿者/ ネタ好き (561回)-(2008/07/14(Mon) 10:35:57)
No21969 (開発者駆け出し さん) に返信
「コントロール マルチスレッド」で検索したらお望みの情報が出てきます。
まずはそこを読んで分らないところを訊いてください。
引用返信 編集キー/
■21971 / inTopicNo.3)  Re[1]: 別スレッドで作成されたデータをグリッドに表示させる方法
□投稿者/ れい (699回)-(2008/07/14(Mon) 10:40:13)
No21969 (開発者駆け出し さん) に返信
> 「あるスレッドで作成されたコントロールに対してイ、別のスレッドのコントロールを親にすることはできません。」
> とエラーが出てしまいます。

グリッドというのが何だかわかりませんが、
問題はエラーの内容そのままです。

コントロールを生成したスレッドで呼ばなければいけません。
そのためには、Control.Invoke、Control.BeginInvokeを使うと簡単です。

> ネットでInvokeを使ったやり方が記載されていたので、それに沿った修正を加えてみたのですが、
> 問題が解消されません。以下のように修正しました。

delegateのInvokeとControl.Invokeは同じメソッド名ですが、
まったく違うものです。
前者は呼び出しスレッドでデリゲートの指すメソッドを実行するメソッドで、
後者はコントロールの作成スレッドでデリゲートの指すメソッドを実行するメソッドです。

この修正では、delegate.Invokeを使っているので呼び出し元スレッドでViewDGが呼ばれています。
Control.Invoke、今回はDataDG.Invokeを使う必要があります。

引用返信 編集キー/
■21973 / inTopicNo.4)  Re[2]: 別スレッドで作成されたデータをグリッドに表示させる方法
□投稿者/ 開発者駆け出し (7回)-(2008/07/14(Mon) 11:07:29)
No21970 (ネタ好き さん) に返信
> ■No21969 (開発者駆け出し さん) に返信
> 「コントロール マルチスレッド」で検索したらお望みの情報が出てきます。
> まずはそこを読んで分らないところを訊いてください。

早速の返信ありがとうございます。
おっしゃる通りの検索をしてみたところ、欲しかった情報がありました。
その情報を元に修正をしてみたところ、実現できました。
ありがとうございました。
引用返信 編集キー/
■21974 / inTopicNo.5)  Re[2]: 別スレッドで作成されたデータをグリッドに表示させる方法
□投稿者/ 開発者駆け出し (8回)-(2008/07/14(Mon) 11:17:15)
早速のご返信ありがとうございます。

■No21971 (れい さん) に返信
> ■No21969 (開発者駆け出し さん) に返信
>>「あるスレッドで作成されたコントロールに対してイ、別のスレッドのコントロールを親にすることはできません。」
>>とエラーが出てしまいます。
> 
> グリッドというのが何だかわかりませんが、

すみません。DataGridコントロールのことです。

> 問題はエラーの内容そのままです。
> 
> コントロールを生成したスレッドで呼ばなければいけません。
> そのためには、Control.Invoke、Control.BeginInvokeを使うと簡単です。
> 
>>ネットでInvokeを使ったやり方が記載されていたので、それに沿った修正を加えてみたのですが、
>>問題が解消されません。以下のように修正しました。
> 
> delegateのInvokeとControl.Invokeは同じメソッド名ですが、
> まったく違うものです。
> 前者は呼び出しスレッドでデリゲートの指すメソッドを実行するメソッドで、
> 後者はコントロールの作成スレッドでデリゲートの指すメソッドを実行するメソッドです。
> 
> この修正では、delegate.Invokeを使っているので呼び出し元スレッドでViewDGが呼ばれています。
> Control.Invoke、今回はDataDG.Invokeを使う必要があります。

おっしゃる通り、DelegateのInvokeとControl.Invokeがごっちゃになっていました。
修正した結果、機能を実現することが出来ました。
以下ソースです。

    Private Delegate Sub ViewDataDelegate()

    Private Sub ViewData()
        Try
            If (InvokeRequired = True) Then
                ' 別スレッドから呼び出された場合
                Invoke(New ViewDataDelegate(AddressOf ViewData))
                Return
            End If
            DataDG.DataSource = Nothing
            DataDG.DataSource = mdtGrid
         Catch ex As Exception
            Throw
        Finally
        End Try

    End Sub

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -