none
mudar cor da linha da datagrid se campo STATUS = 'F' RRS feed

  • Pergunta

  • olá pessoal,

    quero mudar a cor da linha do dataGrid dependendo do valor do campo lá na tabela, estou fazendo conforme a rotina abaixo, tenho dúvida se é no evento CellFormatting do Datagrid e como verifico o valor do campo na tabela, o nome da tabela é CONTATOS e o campo é STATUS VARCHAR(2), quero que todo registro que possua o campo STATUS = 'F' a linha do DataGrid fique amarelo.

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                if (STATUS = 'F')   // Como fica esse comando com campo STATUS da tabela CONTATOS
                {

                    DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
                    row.DefaultCellStyle.BackColor = Color.Yellow;
                    row.DefaultCellStyle.ForeColor = Color.Red;

                }

            }

    Visual Studio 2010, windowsForm, MySQL, C#

    obrigado.

    quarta-feira, 12 de março de 2014 19:38

Respostas

  • Porter,

     O Matheus quis dizer para você carregar a coluna status em seu grid, porém com visible = false. Mas por que?
     Para você saber qual linha deve pintar. Após carregar o grid crie uma função para pintar as linha verificando se a coluna que está invisível, no caso a 'status', está com valor = 'F', se estiver, pinte. Trocar o bg da linha você já sabe então não deverá ter problemas para criar esse código.

    Qualquer dúvida poste.

    Wennder



    segunda-feira, 17 de março de 2014 12:15

Todas as Respostas

  •     if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Status")
        {
            if (e.Value != null && (string)e.Value == "f")
            {
                e.CellStyle.BackColor = Color.Red;
            }
        }

    Você pode dar uma olhada sobre o evento CellFormatting no seguinte link:
    http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellformatting%28v=vs.110%29.aspx
    quarta-feira, 12 de março de 2014 19:43
  • olá Guilherme, 

    O valor do campo não aparece na DataGridView, ele vai ter que pintar a linha dependendo do valor la na tabela, entendeu ?

    O campo STATUS não aparece na DataGridView.

    obrigado.

    quarta-feira, 12 de março de 2014 19:54
  • Ele está usando um DataGridView,portanto,está colocando os dados do BD no mesmo.
    quarta-feira, 12 de março de 2014 19:59
  • Boa tarde, Porter!
     Poste o código que você está usando para carregar seu grid.

    Wennder


    quarta-feira, 12 de março de 2014 20:43
  • bom dia, Wennder

    O CellFormatting executa normalmente, mas na DataGrid, só está aparecendo o registro com essa condição status = "F", teria que mostrar todos os registros e pintado a linha com a condição desejada e esse campo status não aparecer na DataGrid, eu carrego a DataGrid com o metodo atualizaGrid.

    obrigado.

    private void atualizaGrid()

    {

       string sql = "select status, nomecli,dtcontato, id from contatos order by nomecli";

       DataSet dts = new DataSet();

       MySql.Data.MySqlClient.MySqlDataAdapter datap = new MySqlDataAdapter(sql, Program.conn);

       datap.Fill(dts, "Contatos");
       dataGridView1.DataSource = dts.Tables["Contatos"];

    // CABEÇALHO
       dataGridView1.Columns["id"].HeaderText = "Id";
       dataGridView1.Columns["NOMECLI"].HeaderText = "Cliente";
       dataGridView1.Columns["dtcontato"].HeaderText = "Dia_Contato";

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)

    {

                if (this.dataGridView1.Columns[e.ColumnIndex].Name == "status")
                {
                    if (e.Value != null && (string)e.Value == "F")
                    {
                        DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
                        row.DefaultCellStyle.BackColor = Color.Yellow;
                        e.CellStyle.BackColor = Color.Red;
                    }
                }

    }

    quinta-feira, 13 de março de 2014 12:50
  • É só acrescentar a coluna do status e deixá-la invisível.

    // CABEÇALHO dataGridView1.Columns["id"].HeaderText = "Id"; dataGridView1.Columns["NOMECLI"].HeaderText = "Cliente"; dataGridView1.Columns["dtcontato"].HeaderText = "Dia_Contato"; dataGridView1.Columns["status"].HeaderText = "Status";

    dataGridView1.Columns[3].Visible = false; // 3 é o índice da coluna, visto que começamos a contar do zero

    Isso já mata o problema!

    qlq dúvida, poste!

    []

    quinta-feira, 13 de março de 2014 20:36
  • olá Matheus,

    Fiquei sem entender, se deixar a coluna 3 visible = false, nao pinta a linhas, processa normalmente o CellFormatting, mas nao pinta a linhas.

    dataGridView1.Columns[3].Visible = false; // 3 é o índice da coluna, visto que começamos a contar do zero

    sexta-feira, 14 de março de 2014 13:53
  • Porter,

     O Matheus quis dizer para você carregar a coluna status em seu grid, porém com visible = false. Mas por que?
     Para você saber qual linha deve pintar. Após carregar o grid crie uma função para pintar as linha verificando se a coluna que está invisível, no caso a 'status', está com valor = 'F', se estiver, pinte. Trocar o bg da linha você já sabe então não deverá ter problemas para criar esse código.

    Qualquer dúvida poste.

    Wennder



    segunda-feira, 17 de março de 2014 12:15
  • Imagem:

    Private Sub DataGridView2_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView2.CellFormatting
    	If (e.ColumnIndex = 2) Then
    		If (CType(e.Value, Boolean) = True) Then
    			DataGridView2.Rows(e.RowIndex).Cells(0).Style.BackColor = Color.Aqua
    			DataGridView2.Rows(e.RowIndex).Cells(1).Style.BackColor = Color.Aqua
    			DataGridView2.Rows(e.RowIndex).Cells(2).Style.BackColor = Color.Aqua
    		End If
    	End If
    End Sub

    Eu pintei a linha aonde o check estava ativo para outra cor diferenciando assim dos demais que são fundo de cor branca ...

    Se por acaso precisar ocultar alguma cell abras as configurações e altere para 2 como demostrado figura abaixo ...

    Sendo assim só escondida a coluna Status, mas, presente na grid para a formatação das demais !!!


    Fulvio Cezar Canducci Dias


    segunda-feira, 17 de março de 2014 13:39
  • Poter, é o q o Wennder falou: nós vamos carregar a coluna com índice três para termos uma referência. Entenda que, se a coluna estiver invisível, consigo trabalhar com ela normalmente. Como vc já vai colorir a linha para diferencia, nao precisa mostrar o status, entao, usamos a informação dela para colorir e a escondemos.

    Tendeu ?

    qlq coisa, poste!

    []

    segunda-feira, 17 de março de 2014 18:13
  • olá Matheus, estou conseguindo pintar as linhas normalmente, a minha dificuldade é que se eu colocar a coluna status como visible = false, nenhuma linha é pintada, entedeu ? então ela não está podendo ser visible = false, não sei se estou atribuindo visible=false em lugar errado, mas quando chega na linha destacada abaixo, chega sempre como true, estou declarando a columa como false, assim:

    dataGridView1.Columns["status"].Visible = false;

    Outra dúvida que tenho é se compensa usar esse evento, pois tenho muitos registros, e li em algum lugar que o processamento ficaria muito leto.

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)

            {

            // AQUI CHEGA SEMPRE COMO TRUE

                if (this.dataGridView1.Columns[e.ColumnIndex].Name == "status" && dataGridView1.Columns["status"].Visible == false)

                {

                    if (e.Value.ToString() == "F")
                    {
                        DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
                        row.DefaultCellStyle.BackColor = Color.Yellow;
                    }
                    else
                    {
                        DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
                        row.DefaultCellStyle.BackColor = Color.Silver;
                    }
                }  
            }

    segunda-feira, 17 de março de 2014 19:13