1

作成中の WinForm アプリケーションで自分のコンボ ボックスを設定する際に問題があります。これらのコンボボックスに入力するために使用するデータは、データベースから取得されます。問題は、コンボ ボックスにバインドする必要があるデータが大量にあるため、このプロセスには非常に長い時間がかかり、その間アプリケーション全体がロックされます (データをバインドするプロセス全体は 9 秒以上かかりますが、データベースからデータをプルするのにかかる時間はわずか 400 ミリ秒です)。コントロールの作成(メインスレッド)とコンボボックスの作成(バックグラウンドワーカー)のプロセスを分割することで速度を上げようとしていますが、当然、クロススレッドエラーが発生します。これは私が使用するコードの一部です:

private void Populate()
    {                                  
        comboBox1.BindingContext = new System.Windows.Forms.BindingContext();
        comboBox1.DataSource = MyClass.dtMyDataTable;
        comboBox1.DisplayMember = "TitleColumn";

        .//I repeat the same code for each comboBox
        .//I use the BiningContext because some of the comboBoxes have to display the 
        .//same data.            
    }

このフォームに必要なすべての DataTables を含むクラスを作成しました。データベースからの同じデータを使用するフォームが複数あるため、クラスを作成し、親 Form.Load( )、作成時に子フォームに渡します。このようにして、アプリケーションの読み込み時にデータを読み込みます (それほど時間はかかりません)。そのため、子フォームから呼び出したときにすぐに使用できるようになります。Populate()メソッドからメソッドを呼び出そうとしましたbackgroundWorker.DoWork()が、クロススレッドエラーが発生しました。

私の質問は-これを機能させる方法はありますか?そうでない場合は、代替ソリューションとして何を使用できますか?

ありがとうございました

4

2 に答える 2

-1

私は良い代替手段を見つけました.9秒から1.5秒にスピードアップしました. 解決策はcomboBox.DisplayMember、「comboBox.DataSource」行の BEFORE を配置することです。これは、DisplayMember (または ValueMember) を変更すると、データ ソース自体が再設定されるためです。したがってcomboBox.DisplayMember、「comboBox.DataSource」行の後にある場合、データ ソースは 2 回入力されます (データ ソースをバインドするときに ClearBeforeFill がデフォルトで有効になっていると思います。そのため、バインドされたデータに重複はありません)。

とにかくありがとう。

于 2013-07-25T09:33:01.250 に答える