В приложении я разрабатываю в данный момент, я использую datagridview для отображения данных. Для заполнения его я должен нажать кнопку, и backgroundworker начнет работать, это заполнит таблицу данных и когда это закончило работать, это будет использовать таблицу данных в качестве источника данных для datagrid. Это хорошо работает, UI остается быстро реагирующим и так далее. Но теперь я реализовал окраску к строкам, в зависимости от их значений (Im, все еще играя вокруг с ним, таким образом, любые предложения приветствуются):
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);
}
}
}
}
}
}
}
}
Это дает мне проблемы. Не потому что окраска не работает, она делает. Но потому что это делает это Хеллой медленный. В первый раз это хорошо работает, но когда я нажимаю кнопку снова, это медленно как ад, и datagrid мерцает. Я хочу это выполнение, как постобрабатывают, таким образом, это (или скорее должен), будьте выполнены после того, как backgroundworker завершается. Но когда я называю applycoloring от события RunWorkerCompleted его просто медленным. Что я должен сделать к prvent это? Как я могу удостовериться, что UI не мерцает в то время как его выполнение нового запроса (НЕ ТЕРЯЯ текущие данные в сетке).
Два предложения:
Попробуйте позвонить в SuspendLayout до ваших обновлений. Не забудьте позвонить в ResumeLayout.