Nonblocking更新DataGridView
-
18-09-2019 - |
質問
について?解決方法を利用代表者の更新のメインコントロール部に配置され、スレッドのように働きます。私の問題はこちらについて知っておきましょに混 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
を起こします。
解決
あなたは、レコードを追加しています。これは、それが毎回レイアウトを更新することを意味します。
どのようにあなたについて最初にあなたの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ととも可能です。