GOOGLE ADS

lunes, 2 de mayo de 2022

Binding Source no funciona en nombres de columna con dos o más palabras en DataGridView

Dim bagentdata As New BindingSource
Dim myCommand As New MySqlCommand
Dim myAdapter As New MySqlDataAdapter
Dim myData As New DataTable
Dim SQL As String
Private Sub frmAgent_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
'conn.Open()
ConnectDatabase()
SQL = ""
SQL = "SELECT ID, Name `Agent Name`, Address, Pincode, ContactNo, AltContactNo, SelfIPType, SelfIPRef, SelfIPA, SelfIPP, " & _
"IsIPOPD, IPOPDType, IPOPDValue, IsActive, CreatedBy, CreatedOn FROM tblagentmaster"
myCommand.Connection = Conn
myCommand.CommandText = SQL
myAdapter.SelectCommand = myCommand
myData.Clear()
myAdapter.Fill(myData)
Me.AgentDataView.DataSource = myData
Me.AgentDataView.DefaultCellStyle.Font = New Font("Arial", 10, FontStyle.Bold)
AgentDataView.ReadOnly = True
CloseDatabase()
Catch myerror As MySqlException
MessageBox.Show("Error: " & myerror.Message)
End Try
Clear.PerformClick()
End Sub
Private Sub Search_TextChanged(sender As Object, e As EventArgs) Handles Search.TextChanged
bagentdata.DataSource = myData
AgentDataView.DataSource = bagentdata
bagentdata.Filter = "[Agent Name] Like '%" & Search.Text & "%' " & _
" OR ContactNo = " & Val(Search.Text) & " OR ID = " & Val(Search.Text)
If Search.Text = "" Then
Clear.PerformClick()
End If
End Sub

El filtro por nombre de agente no funciona, por favor, alguien necesita ayuda con esto. Filtrar por ID o Contactno funciona bien. Tengo un tipo de código similar en otra forma, funciona bien.

Editar: Incluso si cambio el SQL = "SELECCIONE ID, Nombre, Dirección, Código PIN, Número de contacto, Número de contacto alternativo, SelfIPType, SelfIPRef, SelfIPA, SelfIPP, IsIPOPD, IPOPDType, IPOPDValue, IsActive, CreatedBy, CreatedOn FROM tblagentmaster" y filtrar texto como bagentdata.Filter = "Name Like '%" & Search.Text & "%' ", luego también Filter By Name no funciona. A continuación, agregue otro código de muestra donde el filtro funciona perfectamente:

Sub ClearAll(rindex As Integer)
Try
ConnectDatabase()
SQL = ""
SQL = "SELECT BillNo as BillNO, date(CaseCreatedOn) as 'Booked On', PatientName as `Patient Name`, UHID, PatientAge as Age, PatientSex as Gender FROM tblbooking " & _
"where BillNo in (SELECT DISTINCT BillNo FROM tblbookingdetails WHERE ItemStatus in (7,8)) ORDER BY 'Booked On', BillNO"
myCommand.Connection = Conn
myCommand.CommandText = SQL
myAdapter.SelectCommand = myCommand
myData.Clear()
myAdapter.Fill(myData)
allbilldtv.DataSource = myData
CloseDatabase()
Catch myerror As MySqlException
MessageBox.Show("Error: " & myerror.Message)
End Try
Try
allbilldtv.CurrentCell = allbilldtv.Rows(rindex).Cells(0)
allbilldtv_CellClick(Nothing, Nothing)
Catch err As ArgumentOutOfRangeException
MessageBox.Show("Report Generate Queue All Cleared...!!!", "©2022-25 Healeon™ - All Rights Reserved®", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Try
End Sub
Private Sub CommonSearch_TextChanged(sender As Object, e As EventArgs) Handles CommonSearch.TextChanged
Try
allbilldata.DataSource = myData
allbilldtv.DataSource = allbilldata
allbilldata.Filter = "[Patient Name] Like '%" & CommonSearch.Text.ToUpper & "%' OR BillNO = " & Val(CommonSearch.Text)
If CommonSearch.Text = "" Then
ClearAll(0)
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub


Solución del problema

De acuerdo con la documentación de BindingSource.Filter ( here ):

Si el origen de datos subyacente es un DataSet, DataTable o DataView, puede especificar expresiones booleanas mediante la sintaxis documentada para la propiedad DataColumn.Expression.

Luego, de acuerdo con la documentación de DataColumn.Expression ( here ):

Cuando cree una expresión, use la propiedad ColumnName para hacer referencia a las columnas.

Sugeriría hacer lo siguiente:

  • Configure un punto de interrupción al completar los datos de DataTable

  • Pasar (tecla de método abreviado F10) a la línea siguiente

  • Inspeccione la propiedad Columnas de DataTable

  • Lo que sospecho que está sucediendo es que el método de relleno está masajeando el nombre de la columna para ajustarse a la convención de nomenclatura adecuada, por ejemplo, "Nombre del agente" se convierte en "Nombre del agente". Una vez que tenga el nombre real de DataColumn, utilícelo en su filtro.

    No hay comentarios:

    Publicar un comentario

    Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

    Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...