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

problema con el selectedindexchanged

Estas en el tema de problema con el selectedindexchanged en el foro de .NET en Foros del Web. hola amigos del foro: Me encuentro programando en visual basic .net, hago una busqueda en una base de datos por medio de apellidos y nombre ...
  #1 (permalink)  
Antiguo 19/02/2010, 15:22
 
Fecha de Ingreso: julio-2008
Mensajes: 52
Antigüedad: 15 años, 9 meses
Puntos: 0
problema con el selectedindexchanged

hola amigos del foro:

Me encuentro programando en visual basic .net, hago una busqueda en una base de datos por medio de apellidos y nombre de una persona para que me muestre los datos de ella. Lo hago por medio de un combobox y cuando se localiza a la persona se selecciona de la lista desplegable del combo. El error sucede cuando escribo un apellido que no exista dentro de la base y al dar enter me arroja el siguiente error:

InvalidArgument=El valor de '0' no es válido para 'index'.

no he podido controlar este error. Alguien me podria decir como corregirlo??

se lo agradecere bastante..

aqui muestro mi codigo para mejor entendimiento

con este codigo muestro en cajas de texto los datos que coincidan con el nombre seleccionado


Private Sub cbbApellidos_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbbApellidos.SelectedIndexChanged

Dim x As Integer = Me.cbbApellidos.Text.IndexOf(",")
CargarDatos("Select * from CLIENTES")

If x > -1 Then
Dim nombre, apellidos As String
apellidos = Me.cbbApellidos.Text.Substring(0, x).TrimEnd()
nombre = Me.cbbApellidos.Text.Substring(x + 1).TrimStart()

Filas = Tabla.Rows
Buscar_fila = Tabla.Select("Apellidos_cliente = '" & apellidos & "' AND Nombre_cliente = '" & nombre & "'")

If (Buscar_fila.GetUpperBound(0) = -1) Then
MessageBox.Show("El Cliente que busca no Existe vuelva a introducir sus Apellidos", "Buscar")
Exit Sub
End If

Dim i, j, posi As Integer

For i = 0 To Buscar_fila.GetUpperBound(0) 'Indica el tamaño del arreglo

For j = 0 To Filas.Count - 1
If (Filas(j).Equals(Buscar_fila(i))) Then
posi = j
Exit For
End If
Next

Next

BindingSource.Position = posi
Enlazar_Datos_Clientes()

End If
End Sub


gracias a todos hasta luego
  #2 (permalink)  
Antiguo 19/02/2010, 23:38
Avatar de ldcd  
Fecha de Ingreso: enero-2010
Ubicación: Distrito Federal
Mensajes: 57
Antigüedad: 14 años, 3 meses
Puntos: 6
Respuesta: problema con el selectedindexchanged

me parece que el indice del combo box inicia en 0 en el primer apellido de la base de datos, entonces si tu escribes uno que no existe pues no le estas asignando ningun valor a la variable que tiene tu indice. puedes cambiar a que la consulta la puedas escribir en un textbox
  #3 (permalink)  
Antiguo 20/02/2010, 09:36
 
Fecha de Ingreso: julio-2008
Mensajes: 52
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: problema con el selectedindexchanged

muchas gracias por la respuesta. No habría alguna forma de capturar el error?

o de controlar con codigo para que no ocurra ese error?

he intentado con el try catch pero eso no me ha funcionado pues desde antes de
que llegue al codigo del procedimiento marca el error no se a ciencia cierta en cual
evento me esta marcando ese error

gracias por sus respuestas
  #4 (permalink)  
Antiguo 20/02/2010, 15:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema con el selectedindexchanged

Cita:
he intentado con el try catch pero eso no me ha funcionado pues desde antes de
que llegue al codigo del procedimiento marca el error no se a ciencia cierta en cual
evento me esta marcando ese error
Por lo pronto, si no sabes a ciencia cierta dónde se está produciendo el error, entonces debes poner un try / catch en cada método o evento programado, poniendo un stop en el catch de cada uno, hasta determinar cuál es el que llama al error.

Por otro lado, no has puesto en tu código ningún Try/Catch, o al menos no aparece, por lo que no sabes exactamente lo que sucede. En todo caso, yo intentaría probar con esta forma:
Código vb.net:
Ver original
  1. Private Sub cbbApellidos_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbbApellidos.SelectedIndexChanged
  2.         Dim x As Integer = Me.cbbApellidos.Text.IndexOf(",")
  3.         CargarDatos("Select * from CLIENTES")
  4.         If x >= 0 Then
  5.             Dim nombre, apellidos As String
  6.             apellidos = Me.cbbApellidos.Text.Substring(0, x).Trim()
  7.             Filas = Tabla.Rows
  8.             Buscar_fila = Tabla.Select("Apellidos_cliente = '" & apellidos & "' AND Nombre_cliente = '" & nombre & "'")
  9.             If Buscar_fila.Length = 0 Then
  10.                 MessageBox.Show("El Cliente que busca no Existe vuelva a introducir sus Apellidos", "Buscar")
  11.                 Exit Sub
  12.             End If
  13.             Dim i, j, posi As Integer
  14.             For i = 0 To Buscar_fila.Length - 1 'Indica el tamaño del arreglo
  15.                 For j = 0 To Filas.Count - 1
  16.                     If (Filas(j).Equals(Buscar_fila(i))) Then
  17.                         posi = j
  18.                         Exit For
  19.                     End If
  20.                 Next
  21.             Next
  22.             BindingSource.Position = posi
  23.             Enlazar_Datos_Clientes()
  24.  
  25.         End If
  26.     End Sub
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/02/2010, 16:20
 
Fecha de Ingreso: julio-2008
Mensajes: 52
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: problema con el selectedindexchanged

hola muchas gracias por las respuestas:

ya he puesto try catch a todos los procedimientos de mi formulario pero aun asi
no se atrapa el error no se que esta pasando es un error que no se ha podido controlar me saca completamente de la aplicación

Aqui pongo el codigo de todo lo que hago con el combobox cbbApellidos
haber si alguien podria hecharme la mano en resolver esto

ya cambie el codigo y aun asi me sigue dando error

aqui hace la busqueda en la base de datos en el evento key press y muestra todas las posibles opciones de lo que se escribe dentro del combobox

Private Sub cbbApellidos_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cbbApellidos.KeyPress
Try

Dim comando As New SqlCommand("Select Nombre_cliente,Apellidos_cliente from CLIENTES where Apellidos_cliente like '" & cbbApellidos.Text & "%'", conexion)
'Abrir_Conexion()
conexion.Open()
Dim lector As SqlDataReader = comando.ExecuteReader

Me.cbbApellidos.Items.Clear()
Me.cbbApellidos.DroppedDown = True
Try
Do While lector.Read
Me.cbbApellidos.Items.Add(lector("Apellidos_client e") & ", " & lector("Nombre_cliente"))
Loop
lector.Close()

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "ERROR")
End Try

Cerrar_Conexion()
Me.cbbApellidos.SelectionStart = Len(cbbApellidos.Text)
Catch ex As Exception
MsgBox(Err.Description)
End Try

End Sub

EN ESTE PROCEDIMIENTO SOLO CAMBIO A MAYUSCULAS LO QUE ESCRIBO PORQUE NO ENCONTRE OTRA FORMA DE HACERLO EN TIEMPO DE DISEÑO

Private Sub cbbApellidos_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbbApellidos.TextChanged
Try


Dim I As Integer
Me.cbbApellidos.Text = UCase(Me.cbbApellidos.Text)
I = Len(cbbApellidos.Text)
Me.cbbApellidos.SelectionStart = I
Catch ex As Exception
MsgBox(Err.Description)
End Try

End sub

Y ESTE PROCEDIMIENTO ES PARA QUE ME MUESTRE LOS DATOS DE LA PERSONA QUE ESTOY BUSCANDO

Private Sub cbbApellidos_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbbApellidos.SelectedIndexChanged
Try
Dim x As Integer = Me.cbbApellidos.Text.IndexOf(",")
CargarDatos("Select * from CLIENTES")

If x >= 0 Then
Dim nombre, apellidos As String
apellidos = Me.cbbApellidos.Text.Substring(0, x).TrimEnd()
nombre = Me.cbbApellidos.Text.Substring(x + 1).TrimStart()

Filas = Tabla.Rows
Buscar_fila = Tabla.Select("Apellidos_cliente = '" & apellidos & "' AND Nombre_cliente = '" & nombre & "'")

If Buscar_fila.Length = 0 Then
MessageBox.Show("El Cliente que busca no Existe vuelva a introducir sus Apellidos", "Buscar")
Exit Sub
End If

Dim i, j, posi As Integer

For i = 0 To Buscar_fila.Length - 1 'Indica el tamaño del arreglo

For j = 0 To Filas.Count - 1
If (Filas(j).Equals(Buscar_fila(i))) Then
posi = j
Exit For
End If
Next

Next

BindingSource.Position = posi
Enlazar_Datos_Clientes()

End If


Catch ex As Exception
MsgBox(Err.Description)
End Try
End Sub


EL PROBLEMA SIGUE SIENDO CUANDO YO TECLEO EL APELLIDO Y NOMBRE DE UNA PERSONA QUE NO EXISTE EN LA BASE DE DATOS Y LE DOY ENTER NO SE PUEDE CONTROLAR EL ERROR SIGUIENTE: InvalidArgument=El valor de '0' no es válido para 'index'.
Nombre del parámetro: index

al marcar este error me saca completamente de la aplicacion y eso me da muchos problemas

alguien podria decirme como controlarlo o que esta mal en mi codigo??

muchas gracias por la ayuda
  #6 (permalink)  
Antiguo 23/02/2010, 18:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema con el selectedindexchanged

Vamos a concentrarnos por partes.
En el primer método (trata de usar los bbcode provistos por FDW, así el texto es más claro), es mejor que el proceso quede completamente separado de la declaración de las variables, de modo de evitar problemas con su ambiente.
Pero además es conveniente que antes de ponerte a borrar el ComboBox o cargarlo, te asegures que haya algo que cargar.
Código vb.net:
Ver original
  1. Private Sub cbbApellidos_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cbbApellidos.KeyPress
  2.         Dim lector As New SqlDataReader
  3.         Dim comando As New SqlCommand
  4.         Try
  5.             'Abrir_Conexion()
  6.             conexion.Open()
  7.             comando = New SqlCommand("SELECT Nombre_cliente,Apellidos_cliente FROM clientes WHERE Apellidos_cliente like '" & cbbApellidos.Text & "%'", conexion)
  8.             lector = comando.ExecuteReader
  9.             If lector.Item.Count > 0 Then
  10.                 Me.cbbApellidos.Items.Clear()
  11.                 Me.cbbApellidos.DroppedDown = True
  12.                 Do While lector.Read
  13.                     Me.cbbApellidos.Items.Add(lector("Apellidos_client e") & ", " & lector("Nombre_cliente"))
  14.                 Loop
  15.             End If
  16.             lector.Close()
  17.             Cerrar_Conexion()
  18.             Me.cbbApellidos.SelectionStart = Len(cbbApellidos.Text)
  19.         Catch ex As Exception
  20.             MsgBox(ex.Message, MsgBoxStyle.Critical, "ERROR")
  21.         End Try
  22.     End Sub
Respecto al segundo método, no hay mucho por decir, porque lo que buscas es suplir una propiedad que el ComboBox no tiene. Es una forma de hacerlo.

Pero el tercero me parece discutible por varias razones:
- Se supone que deberías usar a las propiedades SelectedItem o SeletedIndex para obtener los valores a buscar, pero en lugar de eso, quieres usar el Text ya ingresado, que en el evento ya ha dejado de existir. Es más simple usar el SelectedItem, que tiene un valor existente, por lo que es innecesario buscarlo otra vez.
- Cargas una tabla con los datos necesarios y luego vuelves a buscar en la base otro dato... ¿No sería más sencillo usar lo que ya tienes?
- La búsqueda en sí, en el evento de SelectedIndexChanged es rendundante, porque ya lo estás haciendo en KeyPress. Se supone que ya están los valores que se aproximan, por lo cual nunca debería darte la posibilidad de seleccionar algo que no exista. De lo contrario, el valor de SelectedIndex daría -1 (y no 0).

Yo trataría de plantear el método de nuevo desde cero. Me parece que se puede hacer más eficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: Ninguno
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 01:28.