Vanderlei,
Creio o problema é de lógica.
Pense que para gravar ou cancelar, existe uma determinada condição (que depende de sua regra de negócio), portanto, gravar ou cancelar, depende dessa condição ser atendida.
Uma vez que você chamou a rotina ‘IncluiProd’ (que está no evento click do botão) ela será realizada e é isso que deve acontecer.
Sendo assim, só chame a rotina salvar se você tem certeza que quer salvar a informação.
Não está claro o que faz o botão cancelar. Se você quer apenas descartar os dados de um form, basta apenas sair ou limpar os componentes (Text, OptionButton, etc), sem fazer qualquer persistência no BD.
Dica:Separe a coisas, evite codificar nos eventos. Crie métodos à parte, assim você pode reutlilizá-lo em outras situações. Você pode reutilizar por exemplo em outro botão click, form1, form2, menu, menuitem, menucontext, etc., chamando o mesmo método. Senão, você teria que reescrever o código salvar em todos eles, ou usar outras formas (delegates) para chamar o método que está no evento do botão.
Vou demonstrar através de um pseudo código: (Informo que não conheço a regra de negócio, portanto, é só um modelo)
private void btIncluiProd_Click(object sender, EventArgs e)
{
if condiçãoAtendida então
if(GravarDados(param1, param2, ...)) //o método retorna um bool, se retornar verdadeiro atualiza gridview
AtualizarGridView();
else
TratarErro();
fim if
fim if
}
Public bool GravarDados(param1, param2, ...)
{
try {
codificação....
return true //se sucesso, retorna verdadeiro
}
catch {
return false //senão, retorna falso
}
}
public void AtualizarGridView()
{
codificação....
}
Percebi que você tem um datagridview (dgvpProd).
Esse dgv deve ser atualizando quando? Somente se o dado for inserido no banco, ou em qualquer circunstância?
Encontre uma solução para separar a atualização do gridview e a persistência no BD, mesmo que ambos sejam atualizados simultaneamente.