1

わかりましたので、バックグラウンド スレッドで DataGridView を BindingSource にバインドしていますが、「しばらくお待ちください」というモデル ウィンドウがユーザーを楽しませています。問題ない。

ただし、行の databounditem タイプに基づいて、行の背景色の一部を変更する必要があります。このような:

for (int i = 0; i < dgItemMaster.Rows.Count; i++)
{
  if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "Package")
  {
   dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.PowderBlue;                    
  }
}

プログラムでこれを行うことができますが、行の反復中に GUI をロックするのに十分な行です。状況に対処する最善の方法についてのアイデアを探しています。

これは私が今していることです:

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            dgItemMaster.DataSource = products;
            dgItemMaster.BeginInvoke((Action)(() =>
            {
                for (int i = 0; i < dgItemMaster.Rows.Count; i++)
                {
                    if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "Package")
                    {
                        dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.PowderBlue;
                    }
                    else if (dgItemMaster.Rows[i].DataBoundItem.GetType().Name == "PackageKit")
                    {
                        dgItemMaster.Rows[i].DefaultCellStyle.BackColor = Color.Pink;
                    }
                }
            }));
        }
4

2 に答える 2

1

ここのデータ量は?UI をハングアップさせるためには、自明ではない必要があります。極端な答えの 1 つは、仮想モードに切り替えることですが、それは大変な作業です。

単純に UI をハングさせたくない場合は、おそらく最初のx (20? 50?) 行をすぐに実行し、残りをバッチで実行します - 基本的に をエミュレートしDoEventsますDoEvents

(未テスト)

        int startIndex = 0;
        Action action = null;
        action = () =>
        {   // only processes a batch of 50 rows, then calls BeginInvoke
            // to schedule the next batch
            int endIndex = startIndex + 50;
            if (endIndex > dgItemMaster.Rows.Count) endIndex = dgItemMaster.Rows.Count;

            if (startIndex > endIndex)
            {
                for (int i = startIndex; i < endIndex; i++)
                {
                    // process row i
                }

                startIndex = endIndex;
                this.BeginInvoke(action); // next iteration
            }                
        };

        // kick it off
        this.BeginInvoke(action);
于 2008-11-04T05:04:29.627 に答える
1

RowAdded イベントで背景色を変更するコードを実行してみます。これは、グリッドに追加された行ごとに発生します。リスト全体を再度繰り返す必要はありません。

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.rowsadded.aspx

幸運を。

于 2008-11-03T21:12:07.877 に答える