Inquiridor
Validação em DataGridView com campo Unique

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.
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; -
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" ?
-
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; } } } }