質問

について?解決方法を利用代表者の更新のメインコントロール部に配置され、スレッドのように働きます。私の問題はこちらについて知っておきましょに混 DataSet (2000年)で示される DataGridView, で5-8秒、グリッドを生成するために中5-8秒のGUIがロックされています。を更新する方法を教えてください、 DataGridView なのでロックしないよう、ユーザインタフェース?

ている場合がありますので問題ないのが遅いクエリをデータベースにUIがブロックとい DataSet object[] 追加のオブジェクトの配列を BindingList<object>DataGrid 結う:

BindingList<object> dataProvider = new BindingList<object>();
DataGridView gridView = new DataGridView();
gridView.DataSource = dataProvider;

// ...stuff happens...

object[] source = dataSet; //of 2000 items
foreach (object item in source) {  //this foreach blocks
    dataProvider.Add(item);
}

また様々なものにこんな作業だった参照)を委譲することに dataProvider.Add(), がん物質でも起こ制に関す。

カップルで良い提案を中心に BindingList 最初の設定 gridView.DataSource.この作品で更にグリッドを瞬時にのみ見追加データを別の新しい BindingList, せ gridView.DataSource.copyTo() (取得、既存のデータ)を新規データを設定し、 gridView.DataSource 新しい BindingList.これは動作しませんからのオブジェクトマイリストにない静的は、各データのアップロードがサーバーには非同期的に、複製して新しい BindingList を起こします。

役に立ちましたか?

解決

GridViewのは、データソースにリンクされている間、

あなたは、レコードを追加しています。これは、それが毎回レイアウトを更新することを意味します。

どのようにあなたについて最初にあなたのDataSourceを埋めるだけにしてDataSourceプロパティを設定する?

gridView.DataSource = null;
...stuff happens...

object[] source = dataSet; //of 2000 items
foreach (object item in source) {  //this foreach blocks
    dataProvider.Add(item);
}

gridView.DataSource = dataProvider;

foreachループは、別のスレッドに行くことができますが、私はあなたがそれを必要としないと思います。

他のヒント

ニックはBackgroundWorkerは、おそらくあなたの最善の策であると述べたと同様ます。

ここでは非常に簡単な例です。

public partial class Form1 : Form
{
    BackgroundWorker b = new BackgroundWorker();

    public Form1()
    {
        InitializeComponent();
        b.RunWorkerCompleted += new RunWorkerCompletedEventHandler(b_RunWorkerCompleted);
        b.DoWork += new DoWorkEventHandler(b_DoWork);
    }

    void b_DoWork(object sender, DoWorkEventArgs e)
    {
        // build dataset here and assigning it to results
        e.Result = dataset;            
    }

    void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // assign the dataset you built in DoWork in the gridview and update it
        dataGridView1.DataSource = e.Result;
        dataGridView1.Update();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        b.RunWorkerAsync();
    }
}

見を BackgroundWorker.かつて自分が少しでGoogleととも可能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top