Foros del Web » Programación para mayores de 30 ;) » .NET »

BindingNavigator y controlar campo nulos

Estas en el tema de BindingNavigator y controlar campo nulos en el foro de .NET en Foros del Web. Hola. tengo un formulario con un bindingNavigator y los campos correspondientes para visualizar/modificar los datos. algunos de los campos no permiten valores nulos, asi q ...
  #1 (permalink)  
Antiguo 03/05/2009, 11:38
 
Fecha de Ingreso: abril-2009
Mensajes: 32
Antigüedad: 15 años
Puntos: 0
BindingNavigator y controlar campo nulos

Hola. tengo un formulario con un bindingNavigator y los campos correspondientes para visualizar/modificar los datos. algunos de los campos no permiten valores nulos, asi q controlo las excepciones para mostrar los mensajes correspondientes cuando guardo los datos.
pero me ha surgido un problema q no se me ocurre como controlarlo. stoy navegando por los registros y le doy a añadir uno nuevo (con el codigo q tiene po defecto) no meto ningun dato y le doy al boton de ir al registro anterior. evidentemente peta porq tds los campo estan vacios y hay alguno q no permiten nulos.
Cómo y/o dónde puedo controlar esa excepcion para que muestre le mensaje correspondiente o q si todo está vacio haga un cancelEdit??

Yo estoy en blanco :(
muchas gracias de antemano.

Bye!!

Última edición por kreikol; 03/05/2009 a las 11:48
  #2 (permalink)  
Antiguo 03/05/2009, 12:50
 
Fecha de Ingreso: abril-2009
Mensajes: 32
Antigüedad: 15 años
Puntos: 0
Respuesta: BindingNavigator y controlar campo nulos

se me olvidó comentar que lo que más me descoloca es que el error lo da en esta línea de código "Application.Run(new Principal());":

Código:
namespace ServyGuar
{
    static class Program
    {
        /// <summary>
        /// Punto de entrada principal para la aplicación.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Principal());
        }
    }
He intentado controlarla con el evento DataError del bindingSource, pero ni siquiera pasa por ahí.
  #3 (permalink)  
Antiguo 04/05/2009, 20:48
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 23 años, 6 meses
Puntos: 19
Respuesta: BindingNavigator y controlar campo nulos

Hola.
Lo que tendrías que hacer es vos crear el código para el botón guardar, porque seguramente lo hace directamente el control. Tendrías vos que crear un botón guardar, en donde primero valides los campos y despues ejecutes los cambios.

Por ejemplo crea vos un botón "Agregar" y adentro pone:

tuBindingSource.Addnew()

Esto ve va a permitir poner los campos en blancos para agregar nuevo registro

Luego crear un botón "Guardar" y pone este código

tuBindingSource.EndEdit()

Eso te guarda los cambios y antes de ese linea podes meter las validaciones. Proba buscar en la web los metodos del bindingsource "AddNew" y "EndEdit"
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
  #4 (permalink)  
Antiguo 05/05/2009, 07:23
 
Fecha de Ingreso: abril-2009
Mensajes: 32
Antigüedad: 15 años
Puntos: 0
Respuesta: BindingNavigator y controlar campo nulos

Hola Trulala, lo q dices lo tengo pensado, pero es que ese no es el problema, el problema es cuand le doy al boton anterior.
Hice que en el evento CurrentChanged del BindingSource se validaran los campos, asi se validarian cada vez q cambiara de registro sea con el botón q sea, pero lo más gracioso es qe lo depuré con puntos de control para ver cómo pasaba y no me sirve porq cuando le das al boton anterior (poniendo el codigo yo, osea restando uno al position) y en esa linea donde resto el position peta, no llega a pasar por el evento currentChanged; sin embargo si en un registro qya está creado alguno de los campos q no permiten nulos lo borro y lo dejo vacío, me cambio de registro y no peta, y al guardar tampoco!! No entiendo porq cuando es nuevo peta y cuando ya esa creado no. pero bueno.. He decidido poner los codigs de los botones a mano, y crear una funcion para validar los campos q la llamaré cada vez q cambie de registro con el botón que sea, así me olvid de problemas y me curo en salud.
  #5 (permalink)  
Antiguo 05/05/2009, 07:31
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 23 años, 6 meses
Puntos: 19
Respuesta: BindingNavigator y controlar campo nulos

Hola.
Para mi es lo mejor que hagas vos a manos entonces los botones, además en un futuro si necesitas más funcionalidad te va a ser mas facil si vos los tenes desarrolado. Solamente borra los botones de la barrita y agrega los tuyos y listo.
Suerte y cualquier cosa aca estamos
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
  #6 (permalink)  
Antiguo 14/05/2009, 02:36
 
Fecha de Ingreso: abril-2009
Mensajes: 32
Antigüedad: 15 años
Puntos: 0
Respuesta: BindingNavigator y controlar campo nulos

Hola de nuevo,revivo el post por la pregunta q voy ahcer viene a raiz de lo comentado aquí.

Al final hice lo q comentamos y cree yo el código de los botones, para llevar el control. me cree tmb una función para validar los campos q la llamo desde los métodos de los botones cuando es necesario. la funciona validarCampos() comprueba todos los campos y crea un string con los errores encontrados, y al final si el string no está vació lanza una excepción q me he creado.

Bien eso funciona correctamente excepto en un caso q funciona, pero cuando lueog capturo mi excepcion y muestro el mensaje de error esa linea me genera una excepción de NoNullAllowedException.
Os pongo le código de la funciona validarCampos() y el de la funcion donde me sata la otra excepcion:

Código:
private void validarCampos()
        {
            StringBuilder error = new StringBuilder();

            if (dniTextBox.Text.Trim() == "")
                error.AppendLine("El campo DNI no puede ser nulo");

            if (cmbCategoria.Text == "")
                error.AppendLine("El campo Categoría no puede ser nulo");

            if (nombreTextBox.Text == "")
                error.AppendLine("El campo Nombre no puede ser nulo");

            if (apellidosTextBox.Text == "")
                error.AppendLine("El campo Apellidos no puede ser nulo");

            if (direccionTextBox.Text == "")
                error.AppendLine("El campo Dirección no puede ser nulo");

            if(cod_postalTextBox.Text == "")
                error.AppendLine("El campo Código Postal no puede ser nulo");

            if(poblacionTextBox.Text == "")
                error.AppendLine("El campo Población no puede ser nulo");

            if(cmbProvincia.Text == "")
                error.AppendLine("El campo Provincia no puede ser nulo");

            if(cmbFormaPago.Text == "")
                error.AppendLine("El campo Forma de Pago no puede ser nulo");

            if(error.ToString() != "")
                throw new CamposInvalidosExcepcion(error.ToString());

        }

private void lista_Click(object sender, EventArgs e)
        {
            try
            {
                validarCampos();
            }
            catch (CamposInvalidosExcepcion ups)
            {
                MessageBox.Show("Revise los siguientes errores: \n\n" + ups.Mensaje, "Campos incorrectos");
            }
            catch (Exception ups)
            {
                MessageBox.Show("Se produjo un error inesperado. ERROR:\n" + ups.Message, "Error");
            }
        }
La excepción me salta en esta línea "MessageBox.Show("Revise los siguientes errores: \n\n" + ups.Mensaje, "Campos incorrectos");"

La solución q se me ha ocurrido en un primer momento es meterla linea del cath dentro deotro try -catch en el q controle la excepcion notnull. Pero.... es que no entiendo porqué salta, sobre todo porq e los otros casos q llamo a validar campos no salta. la excepción salta si alguno de los campos q no permiten nulos son nulos, pero porqué sólo en ese caso, y en los otros casos en los q tmb estan nulos no salta?? Y porque lanza esa excepcion la función Show de messageBox ?¿

Bueno a ver si alguien me puede echaruna mano, muchas gracias.

Un saludo!!
  #7 (permalink)  
Antiguo 14/05/2009, 10:33
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 23 años, 6 meses
Puntos: 19
Respuesta: BindingNavigator y controlar campo nulos

Capas que en algún momento ups.Mensaje tenga un valor raro o algo por el estilo. Fiajte cuando te da el error juego en esa linea, fijate que valor tiene ups.Mensaje

También fijate si podes poner un punto de interrupción en ValidarCampos() y apreta F11 para hacer un seguimiento paso a paso y fijate en que momento te salta el error para que puedas ver que es lo que te está dando el error
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
  #8 (permalink)  
Antiguo 14/05/2009, 12:27
 
Fecha de Ingreso: abril-2009
Mensajes: 32
Antigüedad: 15 años
Puntos: 0
Respuesta: BindingNavigator y controlar campo nulos

El punto de interrupción ya lo puse e validar campos y pasar correcamente por todas las líneas de la función, y es al entrar en el catch de mi excepcion, justo e la linea del messageBox cuand salta el error. Ahora cuando llegue a casa miraré el contenido de ups.Mensaje a ver si tiene algun valor raro auqnue no debería, es un string q creo yo con StringBuilder, añadiendole una línea para cada error y luego se lo paso a la excepción con lafunción ToString()

En cuanto mire el valor posteo de nuevo.

un saludo y gracias
  #9 (permalink)  
Antiguo 14/05/2009, 12:45
 
Fecha de Ingreso: abril-2009
Mensajes: 32
Antigüedad: 15 años
Puntos: 0
Respuesta: BindingNavigator y controlar campo nulos

Ya estoy aki, efectivamente el valor de ups.Mensaje no tiene nada raro:
"El campo DNI no puede ser nulo\r\nEl campo Categoría no puede ser nulo\r\nEl campo Nombre no puede ser nulo\r\nEl campo Apellidos no puede ser nulo\r\nEl campo Dirección no puede ser nulo\r\nEl campo Código Postal no puede ser nulo\r\nEl campo Población no puede ser nulo\r\nEl campo Provincia no puede ser nulo\r\nEl campo Forma de Pago no puede ser nulo\r\n"

Os pego la traza de la excepción auqnue no dice gran cosa, la línea 113 de FrmEmpleados.cs es la del messageBox.
Cita:
No se controló System.Data.NoNullAllowedException
Message="La columna 'dni' no permite tener valores nulos."
Source="System.Data"
StackTrace:
en System.Data.DataColumn.CheckNullable(DataRow row)
en System.Data.DataColumn.CheckColumnConstraint(DataR ow row, DataRowAction action)
en System.Data.DataTable.RaiseRowChanging(DataRowChan geEventArgs args, DataRow eRow, DataRowAction eAction, Boolean fireEvent)
en System.Data.DataTable.SetNewRecordWorker(DataRow row, Int32 proposedRecord, DataRowAction action, Boolean isInMerge, Int32 position, Boolean fireEvent, Exception& deferredException)
en System.Data.DataTable.InsertRow(DataRow row, Int32 proposedID, Int32 pos, Boolean fireEvent)
en System.Data.DataView.FinishAddNew(Boolean success)
en System.Data.DataRowView.EndEdit()
en System.Windows.Forms.CurrencyManager.EndCurrentEdi t()
en System.Windows.Forms.CurrencyManager.ChangeRecordS tate(Int32 newPosition, Boolean validating, Boolean endCurrentEdit, Boolean firePositionChange, Boolean pullData)
en System.Windows.Forms.CurrencyManager.set_Position( Int32 value)
en System.Windows.Forms.ListBox.OnSelectedIndexChange d(EventArgs e)
en System.Windows.Forms.ListBox.WmReflectCommand(Mess age& m)
en System.Windows.Forms.ListBox.WndProc(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
en System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
en System.Windows.Forms.UnsafeNativeMethods.SendMessa ge(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
en System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
en System.Windows.Forms.Control.ReflectMessageInterna l(IntPtr hWnd, Message& m)
en System.Windows.Forms.Control.WmCommand(Message& m)
en System.Windows.Forms.Control.WndProc(Message& m)
en System.Windows.Forms.ScrollableControl.WndProc(Mes sage& m)
en System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
en System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
en System.Windows.Forms.UnsafeNativeMethods.CallWindo wProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
en System.Windows.Forms.NativeWindow.DefWndProc(Messa ge& m)
en System.Windows.Forms.Control.DefWndProc(Message& m)
en System.Windows.Forms.Control.WmKillFocus(Message& m)
en System.Windows.Forms.Control.WndProc(Message& m)
en System.Windows.Forms.ListBox.WndProc(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
en System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
en System.Windows.Forms.SafeNativeMethods.MessageBox( HandleRef hWnd, String text, String caption, Int32 type)
en System.Windows.Forms.MessageBox.ShowCore(IWin32Win dow owner, String text, String caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options, Boolean showHelp)
en System.Windows.Forms.MessageBox.Show(String text, String caption)
en ServyGuar.Empleados.FrmEmpleados.lista_Click(Objec t sender, EventArgs e) en D:\Trabajos\SERVyGUARD\Aplicacion\ServyGuar\ServyG uar\Empleados\FrmEmpleados.cs:línea 113
en System.Windows.Forms.Control.OnClick(EventArgs e)
en System.Windows.Forms.ListBox.WndProc(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
en System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
en System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
en System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
en System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason, ApplicationContext context)
en System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason, ApplicationContext context)
en System.Windows.Forms.Application.Run(Form mainForm)
en ServyGuar.Program.Main() en D:\Trabajos\SERVyGUARD\Aplicacion\ServyGuar\ServyG uar\Program.cs:línea 18
en System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
en System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
en Microsoft.VisualStudio.HostingProcess.HostProc.Run UsersAssembly()
en System.Threading.ThreadHelper.ThreadStart_Context( Object state)
en System.Threading.ExecutionContext.Run(ExecutionCon text executionContext, ContextCallback callback, Object state)
en System.Threading.ThreadHelper.ThreadStart()
InnerException:
  #10 (permalink)  
Antiguo 15/05/2009, 20:27
 
Fecha de Ingreso: octubre-2000
Mensajes: 1.692
Antigüedad: 23 años, 6 meses
Puntos: 19
Respuesta: BindingNavigator y controlar campo nulos

Hola.
Yo te vuelvo a insister que te hagas un F11 para seguir paso a paso, ya que el F11 te permite ir entrando paso a paso a las funciones y veas justo a donde te está saltando el error.

De todos modos por lo que algo raro está pasando y debe ser que te está dando problemas el binding por esto:

System.Data.DataColumn.CheckNullable(DataRow row)

Esto te está como diciendo que hay algún objeto (seguro del binding) que no permite valores nulos y por eso te da el error
__________________
PD: Con amor, fe, amor a Dios y amistad podemos hacer un mundo mejor!!!!
  #11 (permalink)  
Antiguo 16/05/2009, 00:47
 
Fecha de Ingreso: abril-2009
Mensajes: 32
Antigüedad: 15 años
Puntos: 0
Respuesta: BindingNavigator y controlar campo nulos

Buenas de nuevo.
Ya hice lo del F11 Trulala, y el error salta en la línea del messageBox (raro, pero es así).
De todas formas al final he optado por darle una solución y dejar como enabled false el listBox cuando se está añadiendo un nuevo registro, q es el q me está causando el problema. Así me evito problemas, y cuanod le doy a guardar y ya se ha añadido el registro correctamente lo vuelve a poner a true.

Muchas gracias de todas formas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:52.