Pergunta

Eu estou usando C #, WinForms, e .Net 3.5

Meu formulário tem um DataGridView personalizado (buffer duplo para evitar oscilações durante meus eventos CellFormatting, como visto aqui ). Quando eu executar uma pesquisa de banco de dados, eu vincular o conjunto de dados resultante para o datagridview.

I manipular o evento CellFormatting para pintar linhas uma determinada cor, dependendo de seus dados.

código meu DataGridView:

resultsGridView.DataSource = results.DefaultViewManager.DataSet.Tables[0];
resultsGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;
resultsGridView.BorderStyle = BorderStyle.Fixed3D;
resultsGridView.CellFormatting += new DataGridViewCellFormattingEventHandler(resultsGridView_CellFormatting);

Meu código CellFormatting:

void resultsGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    int rowIndex = e.RowIndex;
    DataGridViewRow therow = resultsGridView.Rows[rowIndex];
    if ((bool)therow.Cells["Sealed"].Value == true)
    {
        therow.DefaultCellStyle.BackColor = Color.Pink;
    }
    if (therow.Cells["Database"].Value as string == "PNG")
    {
        therow.DefaultCellStyle.BackColor = Color.LightGreen;
    }
}

Tudo funciona muito bem, exceto que, quando eu lidar com a CellFormatting, evento Paint todo o formulário parece estar desligado. O cursor deixa de piscar na caixa de texto, e do formulário MenuStrip esta aparência:

imagem barra de menu

O topo é antes uma pesquisa, o fundo depois. A barra de menu não irá redesenhar até que eu mouse sobre onde os menuitems são, em seguida, o último item a ser destacado vai ficar assim quando eu mover o mouse para fora da barra de menu. Movendo a forma parece causar-lhe a repintura, mas, em seguida, os restos de problema.

Comentando a linha resultsGridView.CellFormatting no código datagridview corrige completamente o problema.

Am I pintar o errado células, ou há algo que eu preciso mais para pega?

Foi útil?

Solução

Você provavelmente estão causando uma exceção dentro deste evento. Não tenho certeza como o manejo está definido, mas em torno do código com um try catch seria um primeiro passo.

try 
{
   int rowIndex = e.RowIndex;
   ....   
}
catch(Exception ex)
{
    System.Diagnostics.Trace.Error(ex.message);
}

Em uma segunda olhada, eu não acho que therow.Cells["Sealed"] vai funcionar. Tente algo como therow.Cells["dataGridViewTextBoxColumn2"]. Células é indexado pelo Nome da coluna , não DataPropertyName .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top