11/6/09

.net .WinForms. Formulario Edición sencillo.

Tiene validación y controla si se han producido cambios para salir.
Atención a que los "EndEdit" son del BindingSource (por lo que actualiza en todos los sitios que se muestra la fila) y el r.HasVersion(DataRowVersion.Proposed))
para comprobar si se han realizado cambios (el R.rowstate no se actualiza hasta que se ha hecho el "EndEdit" momento en el que no se podrían cancelar los cambios)

Para llamar al formulario según sea Creación o modificación.

internal static void RolCrear() {
dm.rolBindingSource.AddNew();
dm.RolActual.CODIGO = -1;
(new Rol.FE()).ShowDialog();
}
internal static void RolModificar() {
(new Rol.FE()).ShowDialog();
}


Formulario en sí

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace InventarioDHCP.Rol {
public partial class FE : Form {
public FE() {
InitializeComponent();
InicializarComponentes();
}
private void InicializarComponentes() {
this.tbNombre.DataBindings.Add("Text", Program.dm.rolBindingSource, Program.dm.dsOracle.ESPECIALIDAD.NOMBREColumn.ColumnName);
}
private void btnSalir_Click(object sender, EventArgs e) {
this.Close();
}
private void btnGrabar_Click(object sender, EventArgs e) {
this.GrabarYSalir();
}
private void GrabarYSalir() {
if (this.Grabar()) {
this.Close();
}
}
private bool Grabar() {// Devuelve true si fue capaz de grabar
bool result = false;
if (this.EsValido()) {
Program.dm.rolBindingSource.EndEdit();
Program.dm.RolGrabar(Program.dm.RolActual, null);
result = true;
}
return result;
}
private bool EsValido() {
bool result = true;
this.errorProvider1.Clear();
if (this.tbNombre.Text.Equals("")) {
result = false;
this.errorProvider1.SetError(this.tbNombre, "Se ha de indicar un nombre");
}
return result;
}
private void FE_FormClosing(object sender, FormClosingEventArgs e) {
DSOracle.ROLRow r = Program.dm.RolActual;
if (r.HasVersion(DataRowVersion.Proposed)) {// Si no ha cambiado no hacer nada
DialogResult dr = MessageBox.Show("¿Desea grabar los cambios?", "Atención:",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
switch (dr) {
case DialogResult.Yes: {
if (!this.Grabar()) {//Si no es capaz de grabar que no salga del formulario
e.Cancel = true;
}
break;
}
case DialogResult.No: {// Si no quiere grabar, cancelar la edición
Program.dm.rolBindingSource.CancelEdit();
break;
}
case DialogResult.Cancel: {// Si cancela no hacer nada pero tampoco salir del formulario
e.Cancel = true;
break;
}
default: {
throw new Exception("Respuesta no contemplada");
}
}
}
}
}
}


Grabación

public void RolGrabar(DSOracle.ROLRow r, OracleTransaction Trans) {
// Atención si se nos produce un error de compilación en las lineas siguientes hay que ir a la definición de Adapter y cambiarlo por public.
// Esto pasará cada vez que cambiemos algo en DSOracle.
this.rolTableAdapter.Adapter.InsertCommand.Transaction
= this.rolTableAdapter.Adapter.UpdateCommand.Transaction
= this.rolTableAdapter.Adapter.DeleteCommand.Transaction
= Trans;

if (r.RowState == DataRowState.Added) {
r.CODIGO = Util.OracleGetSequence(conOracle, "Rol_SEQ", Trans);
}
rolTableAdapter.Update(r);
}