Visual Basic.NET - Problemas con DataRowView

 
Vista:
sin imagen de perfil

Problemas con DataRowView

Publicado por JAVIER (15 intervenciones) el 27/01/2023 12:59:30
Llevo dos días atascado con este tema. Ya he visto que se ha publicado en este foro, y en otros, anteriormente pero no he encontrado la solución.
Os ruego vuestra ayuda

Se trata que un Combobox me devuelve un DataRowView con el cual no se puede trabajar. Quisiera que me devolviera un objeto del tipo Entero o al menos un String
El campo NumPersona de la tabla Datos Personas es un Entero

Este es el código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
MyCon = MyCnxDB.ConectarBD()
 
        Dim SelectBuscar = txtBuscar.Text
        Dim where As String
        If Me.cmbBuscar.Text = "Nombre" Then
            where = " Nombre like '%" & SelectBuscar & "%' "
        ElseIf Me.cmbBuscar.Text = "Apellidos" Then
            where = " Apellidos like '%" & SelectBuscar & "%' "
        End If
        Dim SqlCombo = "SELECT NumPersona, CONCAT (Apellidos, ', ', Nombre) NombreCompleto FROM DatosPersonas WHERE " & where & " ORDER BY NombreCompleto"
        Dim Combo = New MySqlCommand(SqlCombo, MyCon)
 
        Dim da As MySqlDataAdapter
        Dim ds As DataSet
        Dim dt As DataTable
        Dim row As DataRow
 
        da = New MySqlDataAdapter(Combo)
        ds = New DataSet()
        da.Fill(ds)
        dt = ds.Tables(0)
 
        cmbSeleccionar.DataSource = dt
        cmbSeleccionar.DisplayMember = "NombreCompleto"
        cmbSeleccionar.ValueMember = "NumPersona"
 
        MyCon.Close()
        MyCon.Dispose()

El error 'Conversion from type 'DataRowView' to type 'Integer' is not valid.' se produce en la siguiente linea

1
Dim NumSelec As Integer = CInt(cmbSeleccionar.SelectedValue)

también lo he intentado con

1
2
cmbSeleccionar.DisplayMember = dt.Columns(1).ToString
        cmbSeleccionar.ValueMember = dt.Columns(0).ToString

No me rindo fácilmente pero después de dos días y de leerme todos los foros posibles puedes llegar a la desesperación. Quizá la solución sea una tontería pero no doy con ella
Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con DataRowView

Publicado por Phil Rob (1554 intervenciones) el 28/01/2023 07:41:48
Hola,
Pienso que cuando SelectBuscar es un Integer tienes que quitar las ' de la frase WHERE, escribir Like % a lugar de Like '".
No comprendo la necesidad de Concatenación, ambos campos en Onder By debería ser bastante.
He nunca prueba, dice me como mi repuesta es bien....
Que tenga un buen día..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Problemas con DataRowView

Publicado por JAVIER (15 intervenciones) el 28/01/2023 09:55:41
El WHERE no tiene nada que ver y además el problema no lo tengo en el DisplayMember si no en el ValueMember
El siguiente código da el error igualmente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MyCon = MyCnxDB.ConectarBD()
Dim SqlCombo = "SELECT NumPersona, CONCAT (Apellidos, ', ', Nombre) NombreCompleto FROM DatosPersonas ORDER BY NombreCompleto"
Dim Combo = New MySqlCommand(SqlCombo, MyCon)
 
Dim da As MySqlDataAdapter
Dim ds As DataSet
Dim dt As DataTable
Dim row As DataRow
 
da = New MySqlDataAdapter(Combo)
ds = New DataSet()
da.Fill(ds)
dt = ds.Tables(0)
 
cmbSeleccionar.DataSource = dt
cmbSeleccionar.DisplayMember = "NombreCompleto"
cmbSeleccionar.ValueMember = "NumPersona"
 
MyCon.Close()
MyCon.Dispose()

El error 'Conversion from type 'DataRowView' to type 'Integer' is not valid.' se produce en la siguiente linea

1
Dim NumSelec As Integer = CInt(cmbSeleccionar.SelectedValue)

De todas formas muchas fracia por tu interés
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con DataRowView

Publicado por Phil Rob (1554 intervenciones) el 28/01/2023 10:27:38
Ok había leído malo
Quizá si reemplazas cmbSeleccionar.SelectedValue por cmbSeleccionar.Text ?
El Combo es en relación con una DataTable y la Selecion es un registro completo. Pero cuando selecionas, este es un solo campos que viene en la parte Text del Combo.
....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Phil Rob
Val: 3.353
Oro
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

Problemas con DataRowView

Publicado por Phil Rob (1554 intervenciones) el 28/01/2023 14:55:41
Perdón me, no he todavía dado la buena repuesta : No buscas NombreCompleto, buscas NumPersona.

Ahora, lo miro atentamente. El problema viene de la lectura des los datos.
Este un ejemplo donde cargo un DataTable con Adapter, hago la relacione con el ComboBox y todo funciona.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Private Sub CargarLaTablaConAdapter() ' con DataAdapter   Este es mas simple porque la DataTabla es creada automaticamente
 
        If MisDatos.Tables.Count > 0 Then  ' Para muchas pruebas
            MisDatos.Tables.Clear()
        End If
 
        ParametroConexion()  ' leo la Connctionstring
 
 
       NombreTablaEnDB = "TProducto"  ' NombreTablaEnDB es declarado al inicial
 
 
        Dim UnaTabla As New DataTable
        Dim Consulta As String
 
        Consulta = "SELECT * FROM " & NombreTablaEnDB
 
        Dim MiAdapter As OleDbDataAdapter = New OleDbDataAdapter(Consulta, MiConexion)
 
        MiAdapter.Fill(UnaTabla)
        UnaTabla.TableName = NombreTablaEnDB
        MisDatos.Tables.Add(UnaTabla)
 
        MiAdapter.Dispose()
        MiConexion.Close()
 
        CBTest.DataSource = MisDatos.Tables(NombreTablaEnDB)
        CBTest.DisplayMember = "Articulos"
        Try
            CBTest.ValueMember = "Id"
        Catch
            CBTest.ValueMember = ""
        End Try
 
 
    End Sub
 
 
' mas tarde :
 
    Private Sub CBTest_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CBTest.SelectedIndexChanged
        If Not CargaArticleCompleta Then
            Exit Sub
        End If
 
        Try
            TBValueCombo.Text = CInt(CBTest.SelectedValue)  '  CInt no es necesario por mi ejemplo, lo es solamente por tu codigo
        Catch
 
        End Try
    End Sub

Te propongo de revisar las utilizaciones de DataSet, DataTable, DataRow, ... Mi código parece mas simple, menos posibilidades de errores.

Puedo te enviar mi proyecto de prueba si quieres.

También, puedes me enviar une parte de tu proyecto o una parte de la DB para que lo corrijo.

Espero que este te ayudara ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar