Hola.
Cual es la manera correcta de valida los datos de un datagridview enlazado a un origen de datos?
Cuando tenemos un PK de una tabla, como controlo que no tenga un nulo?
Con CellValidating parece que funciona hasta que cambio de registro y me intenta guardar los cambios pasandose por el forro e.cancel
Como puedo interrumpir el evento BindingNavigatorSaveItem?
Me estoy volviendo loco y no soy capaz de valida los datos introducidos por el usuario en un datagridview.
Un saludo.
Cual es la manera correcta de valida los datos de un datagridview enlazado a un origen de datos?
Que tipo de validaciones?
Cuando tenemos un PK de una tabla, como controlo que no tenga un nulo?
En la base de datos lo pones primary key y not null
Con CellValidating parece que funciona hasta que cambio de registro y me intenta guardar los cambios pasandose por el forro e.cancel
Tendría que ver el código.
Como puedo interrumpir el evento BindingNavigatorSaveItem?
Me estoy volviendo loco y no soy capaz de valida los datos introducidos por el usuario en un datagridview.
Google?
http://msdn.microsoft.com/en-us/library/7ehy30d4(VS.80).aspx (http://msdn.microsoft.com/en-us/library/7ehy30d4(VS.80).aspx)
http://msdn.microsoft.com/en-us/library/ykdxa0bc.aspx (http://msdn.microsoft.com/en-us/library/ykdxa0bc.aspx)
Cita de: D4N93R en 6 Julio 2010, 05:11 AM
Cual es la manera correcta de valida los datos de un datagridview enlazado a un origen de datos?
Que tipo de validaciones?
Me refiero a una tabla con un campo código (PK) y una descripción. Creo el origen de datos y lo arrastro al formulario. En que evento o eventos tengo que realizar la validación que antes de guardar el campo código tenga un valor y que este no esté repetido?
Cuando tenemos un PK de una tabla, como controlo que no tenga un nulo?
En la base de datos lo pones primary key y not null
Eso ya lo tengo y por eso me da error si el usuario solamente introduce la descripción y le da al grabar. Me refiero desde vb.
Con CellValidating parece que funciona hasta que cambio de registro y me intenta guardar los cambios pasandose por el forro e.cancel
Tendría que ver el código.
El cellvalidating cuando utilizo e e.cancel = true no me dejar salir de la celda que se está validando pero me deja cambiar del registro con el ratón. Como puedo hacer para que no salga de la celda de ninguna manera hasta que los datos estén validados?
Como puedo interrumpir el evento BindingNavigatorSaveItem?
Me estoy volviendo loco y no soy capaz de valida los datos introducidos por el usuario en un datagridview.
Google?
http://msdn.microsoft.com/en-us/library/7ehy30d4(VS.80).aspx (http://msdn.microsoft.com/en-us/library/7ehy30d4(VS.80).aspx)
http://msdn.microsoft.com/en-us/library/ykdxa0bc.aspx (http://msdn.microsoft.com/en-us/library/ykdxa0bc.aspx)
Ahora miro los link pero por más que busco en google, no encuentro un código que funcione al 100% y haciendo pruebas siempre acabo con el mensaje de que la clave no puede ser nula.
Ya he visto estos link y todo esto está bien mientras que no utilice el ratón, me controla bien no salir del campo pero en el momento que utilizo el ratón me permite dejar el regisro con la celda sin valida y entonces cuando doy a grabar da el error
Y en la base de datos, esas celdas permiten NULL?
Hola.
soy muy malo explicándome. Voy a poner un ejemplo muy simple.
Tenemos una tabla con dos campos ID (este campo seria clave primaria por lo tanto no permite nulos ) y DESCRIPCION (un campo que permite nulos)
Creo un origen de datos y lo arrastro al form por lo que me crea un datagridview en el formulario.
Lo que tengo que hacer es no permitir grabar si el campo ID es nulo. Pensé que con el evento cellvalidation lo podía controlar utilizando el e.cancel pero solamente me funciona cuando doy a la tabulación y no me permite cambiar de celda pero cuando utilizo el rato y cambio de fila me lo permite y me situo en otra fila donde el cellvalidation lo hace en esta que todo está bien pero cuando doy a guardar me falla el registro donde falta ID que lo he dejado a nulo en el datagridview.
Lo que quiero saber que eventos debo utilizar para validar datos. Además del evento cellvalidation, tengo que codficar algun otro?
Un saludo
El ID debe crearse en la BD (autoincremento y demas), no debes hacerlo en tu aplicacion.
Bueno, no leí todo el post así que puedo estar equivocado. Pero lo que dice 43H4FH44H45H4CH49H56H45H <Fucking se registro estando beodo?>. Tal vez, puede hacerse así, pero en ocasiones se pierde algunos ID's, por eso siempre prefiero <Dependiendo del tiempo para la terminación de la aplicación y de la complejidad de ella> generar esos ID's dentro de mi aplicación. Así podré buscar e intentar ocupar los ID's que no están siendo usados por alguna u otra razón.
Para aplicaciones pequeñas no creo que haya problema hacerlo de un modo u otro, pero si tenemos una BD con bastantes registros?
Cita de: shellroot@alex-laptop:~$ en 7 Julio 2010, 00:19 AMgenerar esos ID's dentro de mi aplicación. Así podré buscar e intentar ocupar los ID's que no están siendo usados por alguna u otra razón.
Que la aplicación busque un Id disponible en una cantidad grande de registros ya es otra cosa...
Cita de: 43H4FH44H45H4CH49H56H45H en 7 Julio 2010, 00:53 AM
Para aplicaciones pequeñas no creo que haya problema hacerlo de un modo u otro, pero si tenemos una BD con bastantes registros?
Cita de: shellroot@alex-laptop:~$ en 7 Julio 2010, 00:19 AMgenerar esos ID's dentro de mi aplicación. Así podré buscar e intentar ocupar los ID's que no están siendo usados por alguna u otra razón.
Que la aplicación busque un Id disponible en una cantidad grande de registros ya es otra cosa...
Exacto, es diferente, para la creación de registros, ponle Identity 1,1, es decir, que comience del 1 y que vaya de 1 a 1, o a tu preferencia.
Nunca crees los ID en la aplicación, a menos de que el modelo de negocios lo requiera.
saludos
Gracias por las respuestas.
Pero al final hay alguna manera de no permitir al usuario abandonar una celda en caso que no cumpla la condición como por ejemplo un campo que tenga que rellenarlo?
Bueno este modo es "cutre", pero puedes mejorarlo:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
try
{
string pru = dataGridView1.Rows[0].Cells[0].Value.ToString();
}
catch (Exception)
{
if (dataGridView1.Rows[0].Cells[0].Selected != true) MessageBox.Show("Inserte ID ");
}
}
Tienes que cambiar los valores de Rows a medida que se hacen las validaciones, lo que hace es tratar de llenar un string con el valor de la 1era fila y celda cuando se hace click en alguna celda que no sea la 1era, si este esta vacio muestra el mensaje.
Seguro hay otro modo mejor, pero puedes probarlo.
En realidad nunca me gustó que el usuario llene data en el Grid View. Ahora, ya todas las dudas se cubrieron menos la parte de la validación no?
Pregunto ahora, qué evento estás usando para validar los datos?
EDIT: Pilla este enlace a ver si te sirve de algo:
http://csharplifestyle.blogspot.com/2009/06/validar-celdas-de-un-datagridview.html (http://csharplifestyle.blogspot.com/2009/06/validar-celdas-de-un-datagridview.html)
Los eventos que estoy utilizando para validar los datos son cellvalidating con el e.cances y dataerror también con su e.cancel correspondiente.
A mi me gusta tambén más utilizar en vez de datagrid, campos simples o como se diga (en origen de datos poner modo detalle) pero tengo problemas con un campo que le he dicho que es de tipo combobox.
Ahora estoy intentando averigual como puedo insertar el código (un numerico) pero quiero hacerlo yo y no que sea autoincremental.
Con el problema con el que me encuentro que no soy capaz de capturar la linea insertada ya que el evento se lanza antes de insertar la línea y es donde lo capturo por lo que siempre me devuelve row 0
Cita de: piwi en 7 Julio 2010, 16:18 PM
Los eventos que estoy utilizando para validar los datos son cellvalidating con el e.cances y dataerror también con su e.cancel correspondiente.
Bueno con los enlaces que te pasé debes solucionar el problema. Sino postea el código de la validación.
Cita de: piwi en 7 Julio 2010, 16:18 PM
Ahora estoy intentando averigual como puedo insertar el código (un numerico) pero quiero hacerlo yo y no que sea autoincremental.
Simplemente lo pones, y ya, Que no sea Identity en la Base de Datos y lo metes en la consulta del insert.
Cita de: piwi en 7 Julio 2010, 16:18 PM
Con el problema con el que me encuentro que no soy capaz de capturar la linea insertada ya que el evento se lanza antes de insertar la línea y es donde lo capturo por lo que siempre me devuelve row 0
A ver, que no entendí bien, estás intentando guardar en el evento de cellvalidating? Puedes intentar guardar en el evento RowLeave o mucho mejor en el RowValidated despues de pasar por un RowValidating.
En el momento de dar al nuevo registro en bindingdourcenavigation, quiero meter en la celda un valor pero no se en que evento lo tengo que hacer porque no se seleccionar bien la nueva fila del datagridview
Hola
Estoy haciendo pruebas de lo más sencillo y no encuentro la solución.
Estoy intentando mantener una tabla con dos campos:
idfabricante clave primaria no nula
d_fabricante
Para ello he creado un origne de datos de esta tabla y lo he arrastrado al formulario.
He codificado los siguientes eventos:
En este evento he añadido a mayores el chequeo del validate por si no pasa la validación que no siga con los cambios.
Private Sub FABRICANTEBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FABRICANTEBindingNavigatorSaveItem.Click
Dim li_retorno As Integer
li_retorno = Me.Validate()
If li_retorno = -1 Then
Me.FABRICANTEBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.FabricanteDataSet)
End If
End Sub
Esto ha sido creado por vb al arrastrar el origen de datos.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: esta línea de código carga datos en la tabla 'FabricanteDataSet.FABRICANTE' Puede moverla o quitarla según sea necesario.
Me.FABRICANTETableAdapter.Fill(Me.FabricanteDataSet.FABRICANTE)
End Sub
Aquí compruebo si idfabricante está nulo
Private Sub FABRICANTEDataGridView_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles FABRICANTEDataGridView.CellValidating
If FABRICANTEDataGridView.Columns(e.ColumnIndex).Name = "DataGridViewTextBoxColumn1" Then
If e.FormattedValue IsNot Nothing AndAlso _
String.IsNullOrEmpty(e.FormattedValue.ToString()) Then
e.Cancel = True
Else
e.Cancel = False
End If
End If
End Sub
En este he metido un mensaje de aviso por si dan a guardar o al nuevo en bindingnavigator
Private Sub FABRICANTEDataGridView_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles FABRICANTEDataGridView.DataError
MsgBox(e.Exception.Message)
e.Cancel = True
End Sub
Validación de la fila
Private Sub FABRICANTEDataGridView_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles FABRICANTEDataGridView.RowValidating
If FABRICANTEDataGridView(0, e.RowIndex).Value Is DBNull.Value Then
MsgBox("Error")
e.Cancel = True
Else
e.Cancel = False
End If
End Sub
Los dos siguientes son de prueba pero me da error de nulo por lo que creo que no me inserta el valor
Private Sub FABRICANTEDataGridView_RowLeave(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles FABRICANTEDataGridView.RowLeave
If FABRICANTEDataGridView(0, e.RowIndex).Value Is DBNull.Value Then
FABRICANTEDataGridView(0, e.RowIndex).Value = UltimoCodigo()
End If
End Sub
Private Sub FABRICANTEDataGridView_RowValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles FABRICANTEDataGridView.RowValidated
If String.IsNullOrEmpty(FABRICANTEDataGridView(0, e.RowIndex).Value) Then
FABRICANTEDataGridView(0, e.RowIndex).Value = UltimoCodigo()
End If
End Sub
Función que me retorna el último id
Private Function UltimoCodigo() As Integer
Dim Conexion As New SqlConnection("Data Source=192.168.1.100;Initial Catalog=PRUEBAS;user id = piwi; password =piwi;")
Dim Datos As New DataSet
Dim li_ultimo As Integer
Conexion.Open()
Dim Adaptador As New SqlDataAdapter("SELECT MAX(IDFABRICANTE) FROM FABRICANTE", Conexion)
Adaptador.Fill(Datos)
li_ultimo = Datos.Tables(0).Rows(0).Item(0)
li_ultimo = li_ultimo + 1
Conexion.Close()
Return li_ultimo
End Function
Con esto no me funciona, donde tengo que asignar el valor al idfabricante para que lo tenga antes de que cambie de fila o que de al boton guardar?
Hola,
Primero, en el evento DataError, no se por qué estás haciendo e.Cancel = True. Eso no lo deberías hacer, ese evento es para controlar luego de que se produce un error.
El Id del fabricante tienes que hacerlo al darle guardar, SIEMPRE, porque imagínate que lo pones al seleccionar la fila, por ejemplo; y te sale el ID 10001 y en otro equipo alguien abre la aplicación y y selecciona otra fila, le aparece el ID 10001, entonces lo que pasa es que al guardar se va a producir un error. Por lo que es mejor SIEMPRE que crees el ID en la base de datos :)
EDIT, utiliza las etiquetas Geshi para postear código.
Probare lo que me dices. En el evento de borrar quiero poner el mensaje si esta seguro pero no soy capaz de parar el borrado ya que el return no funciona y sigue hacia delante.
Lo de calcular el id por la base de datos se hace desde vb? No quiero utilizar los autonumericos
¿Cuál es el problema de usar autonuméricos?
Ah ok, lo de si está seguro o no, tiene que ser ANTES de comenzar el borrado :P
Hay un evento de preborrado?
Por los autonumericos simplemente me gusta tener control calculandolos
Más bien pierdes control, Que ganas teniendo "control" sobre el ID? nada..
CitarHay un evento de preborrado?
Se llama boton de borrar :P Ahi haces la validación xD
En mi caso necesito dar un id por tipo que es otro campo por lo que la clave sería id m
Cita de: D4N93R en 8 Julio 2010, 18:37 PM
Más bien pierdes control, Que ganas teniendo "control" sobre el ID? nada..
En mi caso la clave la forman dos campos, un id y un tipo por lo que tengo que calcular el id dependiendo del tipo.
CitarHay un evento de preborrado?
Se llama boton de borrar :P Ahi haces la validación xD
El botón que utilizo es BindingNavigatorDeleteItem_Click pero ahí ya no puedo hacer nada. Me extraña que no puedan insertar una validación cuando utilizar un bindingnavigator. Quizá hay que sobreescribir el evento y en caso que digan que quieren borrar entonces llamarlo.
Creo que con esto ya he conseguido realizar un modelo para un mantenimiento de una tabla. También tengo contemplado preguntar si se quiere borrar un registro por si alguien no sabe como hacerlo. Quizá todos los sabeís pero por si acaso aquí está.
Si alguien ve algo que no está correcto se lo agradecería
Imports System.Data.SqlClient
Public Class Form1
Private BotonBorrar As ToolStripItem
Private Sub FABRICANTEBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FABRICANTEBindingNavigatorSaveItem.Click
Dim li_retorno As Integer
li_retorno = Me.Validate()
If li_retorno = -1 Then
Me.FABRICANTEBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.FabricanteDataSet)
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: esta línea de código carga datos en la tabla 'FabricanteDataSet.FABRICANTE' Puede moverla o quitarla según sea necesario.
Me.FABRICANTETableAdapter.Fill(Me.FabricanteDataSet.FABRICANTE)
Me.BotonBorrar = FABRICANTEBindingNavigator.DeleteItem
End Sub
Private Sub FABRICANTEDataGridView_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles FABRICANTEDataGridView.CellBeginEdit
If FABRICANTEDataGridView(1, e.RowIndex).Value Is DBNull.Value Then
FABRICANTEDataGridView(1, e.RowIndex).Value = UltimoCodigo()
End If
End Sub
Private Sub FABRICANTEDataGridView_DataError(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) Handles FABRICANTEDataGridView.DataError
MsgBox(e.Exception.Message, MsgBoxStyle.Exclamation, "Fabricantes")
End Sub
Private Sub FABRICANTEDataGridView_RowValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles FABRICANTEDataGridView.RowValidated
Me.TableAdapterManager.UpdateAll(Me.FabricanteDataSet)
End Sub
Private Sub FABRICANTEDataGridView_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles FABRICANTEDataGridView.RowValidating
If FABRICANTEDataGridView(0, e.RowIndex).Value Is DBNull.Value Then
MsgBox("Debe introducir el fabricante", MsgBoxStyle.Exclamation, "Fabricantes")
e.Cancel = True
Else
e.Cancel = False
End If
End Sub
Private Function UltimoCodigo() As Integer
Dim Conexion As New SqlConnection("Data Source=192.168.1.1;Initial Catalog=PRUEBAS;user id = piwi; password = piwi;")
Dim Datos As New DataSet
Dim li_ultimo As Integer
Conexion.Open()
Dim Adaptador As New SqlDataAdapter("SELECT MAX(IDFABRICANTE) FROM FABRICANTE", Conexion)
Adaptador.Fill(Datos)
If Datos.Tables(0).Rows(0).Item(0) Is DBNull.Value Then
li_ultimo = 0
Else
li_ultimo = Datos.Tables(0).Rows(0).Item(0)
End If
li_ultimo = li_ultimo + 1
Conexion.Close()
Return li_ultimo
End Function
Private Sub FABRICANTEBindingNavigator_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles FABRICANTEBindingNavigator.ItemClicked
If e.ClickedItem Is Me.BotonBorrar Then
If MessageBox.Show("Está seguro de querer borrar el registro?", "Fabricantes", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then
Me.FABRICANTEBindingNavigator.DeleteItem = Me.BotonBorrar
Else
Me.FABRICANTEBindingNavigator.DeleteItem = Nothing
End If
End If
End Sub
End Class
Buenísimo, que bueno que resolviste el problema, saludos!
Ahora me encuentro con otro problema. Tengo dos combobox dentro del datagrid enlazados a datos. Como hago para filtrar el contenido del segundo dependiendo de lo que me seleccionen en el primero?
Un saludo.
Una pregunta para poder contestarte, estás queriendo filtrar los resultados con el Combo Box?
Si, tengo un combo con fabricantes y otro con productos al seleccionar un fabricante, solamente mostrar los productos de este.
Fabricantes: idfabricante, fabricante
Productos idproducto(pk), idfabricante, producto
Suscríbete al evento TextChanged o SelectedItemChanged del ComboBox y en ese método setteas
la propiedad Filter del bindingSource apropiadamente.
EDIT:
Ok, es fácil, xD tiempo sin usarlo!! Simplemente en el bindingSource, espero que estés usando uno, en el TextChange o en el SelectedItemChanged modifica la propiedad Filter con el filtro apropiado, como:
bindingSource.Filter = "columna = '"+variableDelComboBox+"'";
Espero te sirva!
Saludos!
Gracias. Ya me filtra. El problema que tengo es cuando cambio el primer combo, como asigno un nulo al segundo para que se borre la selección anterior?
No entendí la pregunta ;D
En el datagridview tengo dos campos de tipo combobox, uno es fabricante y otro producto. En el momento que selecciono el fabricante, me filtra los productos de este.
Lo que quiero es dejar el producto a nulo después de seleccionar el fabricante para así en caso que seleccione otro fabricante, no me quede el producto del anterior fabricante.
Un saludo.
Pero ya vaaa, tu quieres filtrar con los combobox que estan Dentro del Datagrid? Puedes postear un Screenshot de tu formulario por favor.
Perdón por la tardanza pero he estado un poco liado con otros temas.
Aquí pongo la captura.
(http://s2.subirimagenes.com/otros/previo/thump_4822886captura.jpg)
Basicamente lo que tengo son tres origenes de datos, uno licencias que es el que está en el formulario y otros tres que son producto, cliente y local que serán lo que utilizaré en los combobox como muestro en el ejemplo.
El problema lo tengo que si doy a un registro nuevo y en un combobox selecciono un valor, no me deja pasar el foco a otro campo ni hacer nada, como si se bloqueara, solamente seleccionar otro valor del combo.
Como hay que utilizar un combobox que me muestre el nombre del cliente y que contenga la idcliente y lo guarde en licencias?
Gracias por todo.
la verdad no se como lo estas haciendo, no lei todo el topic, pero para cargar un combo lo podes hacer de varias formas, yo no opto por usar los bindingnavigator o como se llamen y enlazar los controles con sus datasources, prefiero escribir codigo y hacerlo todo en clases, si es posible en 3 capas, sino te lias con los origenes de datos, me acuerdo en visual basic 6 con los controles DATA y ADOC se hacia asi :xD, pero eso es prehistoria ya, pero bueno cada uno lo hace como puede o como le enseñaron.
yo para cargar un combo directamente tengo un metodo que me devuelve un datareader y con eso lo recorro y asigno los valores, es lo unico que te puedo decir ya que no uso esa forma.
saludos.
Hola seba123neo
El problema que estoy aprendiendo a marchas forzadas. También lo he intentado de otra forma
Imports System.Data.SqlClient
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: esta línea de código carga datos en la tabla 'LicenciasDataSet.LICENCIAS' Puede moverla o quitarla según sea necesario.
Me.LICENCIASTableAdapter.Fill(Me.LicenciasDataSet.LICENCIAS)
Dim Conexion As String = "Data Source=192.1681.1;Initial Catalog=prueba;user id = piwi; password = piwi;"
Dim da As New SqlDataAdapter("select codcliente, nombrecliente from clientes where codcliente < 5", Conexion)
Dim ds As New DataSet
da.Fill(ds)
Try
IDLOCALComboBox.DataSource = ds.Tables(0)
IDLOCALComboBox.ValueMember = "codcliente"
IDLOCALComboBox.DisplayMember = "nombrecliente"
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
Private Sub LICENCIASBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LICENCIASBindingNavigatorSaveItem.Click
Me.Validate()
Me.LICENCIASBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.LicenciasDataSet)
End Sub
End Class
Me pasa lo mismo, en el momento que selecciono algo, se queda bloqueado y no me deja salir del combobox.
Me podrias explicar o ponerme un codigo para ver la forma correcta de hacerlo?
Gracias.
Por si a alguien le puede ayudar, me respondo a mi mismo
Hay veces que al añadirlo de forma automática, la propiedad que pone como databinding es la propiedad "Text" cuando debería ser "SelectedValue".
Para solucionarlo vamos a las propiedades y en la sección "DataBindings" quitamos el binding de la propiedad "Text" y lo ponemos en la propiedad "SelectedValue"
Sigo sin entender, no era un DataGridView en donde tenías el problema? Ahora tienes es un formulario :-X No entiendou!!
Buenas.
Cuando empecé lo estaba haciendo en un datagrid y lo he conseguido pero me he encontrado con problema que eran varios campos y no me gusta dejar una barra de desplazamiento horizontal porque lo veo poco practico y lo he intentado hacer sin datagridview para que sea más comodo.
De todos modos he dejado una captura de pantalla unos post más abajo donde se ve que lo hacía con campos sueltos.
Cuando doy a nuevo en Bindingnavigator, en que evento puedo darle valor a una caja de texto?
Lo he probado en BindingNavigatorAddNewItem_Click pero este evento se produce justo al dar al boton nuevo así que me inserta el valor en la caja y después me inserta un registro nuevo.
Yo lo que quiero es asignar el valor en el nuevo registro.
Cual es el origen de datos de ese formulario?
No entiendo la pregunta >:( El origen es una tabla de la base de datos. Todo me funciona bien pero lo que quiero es que cuando de al boton nuevo, saber que evento se produce justo despues de insertar el nuevo registro para que cuando asigne un id a la caja de texto, esta sea del registro recien insertado.
"El origen es una tabla de la base de datos"
Ok, pero cuando guardas un registro en la base de datos, lo haces a mano, o utilizas un SqlDataSource?
"Todo me funciona bien pero lo que quiero es que cuando de al boton nuevo, saber que evento se produce justo despues de insertar el nuevo registro"
Después de insertarlo en la base de datos? o despuès de darle click a nuevo?
"para que cuando asigne un id a la caja de texto, esta sea del registro recien insertado."
Entonces el evento que quieres es después de darle click al botón nuevo, antes de darle a guardar?
lo que he hecho es crear y arrastrar el origen de datos al formulario por lo que me ha creado todo automaticamente.
Por un lado la barra de navegacion en la parte superior y los campos sueltos enlazado al origen de datos.
Donde codifico la asignación del valor para que al dar al boton nuevo (+ amarillo) pueda asignar un valor a un campo del nuevo registro'
Imagina un origen de datos id_campo, campo. Estos dos los tengo en el formulario enlazados como he comentado arriba. Cuando doy al boton nuevo me crea un registro nuevo, donde tengo que codificar id_campo.text = contador? para que asigne la variable contador al id_campo del nuevo registro?
Un saludol
Bueno, primero, hubieses solucionado todo esto si usaras Identity en el Primary Key, pero bueno, veamos, debe haber un objeto llamado ALGOBindingSource que tiene un evento al cual te tienes que subscribir: AddingNew y colocar algo así:
private void bindingSource1_AddingNew(object sender, AddingNewEventArgs e)
{
e.NewObject = ((System.Data.DataView)(bindingSource1.List)).AddNew();
((System.Data.DataRowView)(e.NewObject))["Columna1"] = "123";
}
Ahí lo que haces es reemplazar los nombres de los objetos por los de tu formulario, y en vez de poner "123", pones tu contador.
Saludos
Gracias por la respuesta.
El evento que me comentas me hace lo mismo que el BindingNavigatorAddNewItem_Click, es decir, en este evento he puesto un mensaje y la asignación.
Private Sub LICENCIASBindingSource_AddingNew(ByVal sender As Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles LICENCIASBindingSource.AddingNew
IDLICENCIATextBox.Text = "300"
MsgBox("hola")
End Sub
Abro el formulario y me aparecen los campos. Por defecto estoy en el primer registro y cuando doy al nuevo, me pone 300 en el registro actual, me muestra el mensaje y luego me inserta registro nuevo por lo que idlicencia esta vacía.
Yo lo que quiero es que primero inserte nuevo registro y en este que me inserte 300 en idlicenciatextbox.
Estoy hasta los :-X
Pero hazlo como yo te dije, usando el AddingNewEventArgs... No colocando valor a la caja de texto.
Me he perdido :huh:
private void bindingSource1_AddingNew(object sender, AddingNewEventArgs e)
{
//en vez de bindingsource1 pones el nombre de tu bindingsource, es un control que esta abajo del formulario
e.NewObject = ((System.Data.DataView)(bindingSource1.List)).AddNew();
((System.Data.DataRowView)(e.NewObject))["Columna1"] = "123"; // aki pones tu contador
//reemplaza "Columna1" con el nombre de la columna del donde va el contador, el ID ese.
}
A ver si así está mejor.