none
Validação em DataGridView com campo Unique RRS feed

  • Pergunta

  • Boa noite, estou montando um sistema de cadastro de clientes, onde o campo "email" é um campo unique.

    O projeto consiste em:
    Um DataSet tipado com a tabela "clientes" tendo a coluna email como UNIQUE.
    Um DataGridView onde eu posso visualizar os dados do cliente e editá-los.

    Porém, estou com o seguinte problema: ao inserir ou editar um cliente, quero fazer a validação do e-mail (pra ver se já existe outro cliente cadastrado com o mesmo e-mail) no próprio datagridview. Lendo alguns tópicos, eu vi que a validação de dados deve ser feita pelo evento "RowValidating" ou "CellValidating". Porém, não encontrei uma forma de verificar se o e-mail já existe utilizando esses eventos.

    Somente consegui exibir uma mensagem de erro utilizando o evento "DataError" do DataGridView, porém, neste evento eu não consigo "travar" o cliente na célula que está sendo editada (o que consigo fazer no evento CellValidating, utilizando o "e.Cancel = true").

    Gostaria de poder fazer a validação do e-mail e travar o cliente na célula (ou na linha) caso o e-mail já esteja cadastrado.

    Se alguém puder me ajudar, desde já agradeço.
    sexta-feira, 25 de setembro de 2009 02:51

Todas as Respostas

  • Adiciona uma constraint unique no seu datatable Cliente deixando o email como único, se você arrastou do banco e ele ja possui essa constraint ela ja estará no dataset, se não clique na coluna e adicione em propriedades, feito isso usando o CellValiating faça assim:

    if(dataSet.ClienteDataTable.Rows[e.RowIndex].HasErrors)
        e.Cancel = true;

    sexta-feira, 25 de setembro de 2009 12:21
  • MAGomes, obrigado pela resposta, no meu DataSet o campo e-mail já está como UNIQUE, aí no evento CellValidating eu faço a verificação que você recomendou, porém, mesmo eu colocando um e-mail duplicado, ele não acusa o "HasErrors" como true, portanto, ele passa pela validação, mas dispara o evento "DataError" dizendo que a coluna e-mail está com um valor duplicado. Alguma idéia de como resolver isso? pra eu poder fazer a validação pelo evento "CellValidating" ?
    sexta-feira, 25 de setembro de 2009 16:41
  • Tente isso:

    void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
            {
                foreach (DataGridViewRow row in this.dataGridView1.Rows)
                {
                    if (e.ColumnIndex == indicedacolunaemail && row.Index != e.RowIndex)
                    {
                        if (row.Cells[indicedacolunaemail].Value != null && row.Cells[indicedacolunaemail].Value.ToString() == e.FormattedValue.ToString())
                        {
                            e.Cancel = true;
                        }
                    }
                }
                            
            }
    
    sexta-feira, 25 de setembro de 2009 17:33