現在開発中のアプリケーションでは、datagridviewを使用してデータを表示しています。それを埋めるには、ボタンを押す必要があります。バックグラウンドワーカーが実行を開始し、データテーブルを埋め、実行が終了すると、データグリッドのデータソースとしてデータテーブルを使用します。これは正常に機能し、UIは応答性を維持します。しかし今、私はそれらの値に応じて行に色付けを実装しました(私はまだそれで遊んでいるので、どんな提案も歓迎します):
private void ApplyColoring()
{
if (dataGridView1.DataSource != null)
{
foreach (DataGridViewRow dataGridRow in dataGridView1.Rows)
{
// hardmap a color to a column
IDictionary<Int32, Color> colorDictionary = new Dictionary<Int32, Color>();
colorDictionary.Add( 7, Color.FromArgb(194, 235, 211));
colorDictionary.Add( 8, Color.Salmon);
colorDictionary.Add( 9, Color.LightBlue);
colorDictionary.Add(10, Color.LightYellow);
colorDictionary.Add(11, Color.LightGreen);
colorDictionary.Add(12, Color.LightCoral);
colorDictionary.Add(13, Color.Blue);
colorDictionary.Add(14, Color.Yellow);
colorDictionary.Add(15, Color.Green);
colorDictionary.Add(16, Color.White);
foreach (DataGridViewRow gridRow in dataGridView1.Rows)
{
foreach (DataGridViewCell cell in gridRow.Cells)
{
if (colorDictionary.Keys.Contains(cell.ColumnIndex))
{
// standard background
cell.Style.BackColor = Color.FromArgb(194, 235, 211);
}
}
}
IList<String> checkedValues = new List<String>();
// first we loop through all the rows
foreach (DataGridViewRow gridRow in dataGridView1.Rows)
{
IDictionary<String, Int32> checkedVal = new Dictionary<String, Int32>();
// then we loop through all the data columns
int maxCol = dnsList.Count + 7;
for (int columnLoop = 7; columnLoop < maxCol; columnLoop++)
{
string current = gridRow.Cells[columnLoop].Value.ToString();
for (int checkLoop = 7; checkLoop < maxCol; checkLoop++)
{
string check = gridRow.Cells[checkLoop].Value.ToString();
if (!current.Equals(check))
{
if (checkedVal.Keys.Contains(current))
{
gridRow.Cells[columnLoop].Style.BackColor = colorDictionary[checkedVal[current]];
}
else
{
gridRow.Cells[columnLoop].Style.BackColor = colorDictionary[columnLoop];
checkedVal.Add(current, columnLoop);
}
}
}
}
}
}
}
}
これは私に問題を与えています。着色が機能しないからではなく、機能します。しかし、それはそれを遅くするからです。初めては正常に動作しますが、もう一度ボタンを押すと、地獄のように遅くなり、データグリッドがちらつきます。これを後処理として実行したいので、backgroundworkerが完了した後に実行する必要があります(または実行する必要があります)。しかし、RunWorkerCompletedイベントからapplycoloringを呼び出すと、非常に遅くなります。これを防ぐにはどうすればよいですか?新しいクエリを実行している間(グリッド内の現在のデータを失わない間)にUIがちらつかないようにするにはどうすればよいですか?