POPULAR DATAGRIDVIEW
Boa noite,
Só consigo popular a grid na primeira pesquisa, para fazer outra pesquisa, é necessário fechar o formulário.
ou seja, não preenche a grid conforme solicitado, porem, existe o cadastro
Só consigo popular a grid na primeira pesquisa, para fazer outra pesquisa, é necessário fechar o formulário.
ou seja, não preenche a grid conforme solicitado, porem, existe o cadastro
Private Sub txt_FiltraNome_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles txt_FiltraNome.PreviewKeyDown
If e.KeyCode = Keys.Enter Then
Using con As FbConnection = GetConnection()
If ActionSelect = 0 Then
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
End If
If ActionSelect = 1 Then
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CPF LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
End If
Using cmd As New FbCommand(Sql_Cliente, con)
Using dr As FbDataReader = cmd.ExecuteReader()
FlexGrid.Rows.Clear()
Dim l As Integer
While dr.Read()
FlexGrid.Rows.Add()
FlexGrid.Item(0, l).Value = dr.Item([Ô]CODIGO[Ô]).ToString
FlexGrid.Item(1, l).Value = dr.Item([Ô]CPFCNPJ[Ô]).ToString
FlexGrid.Item(2, l).Value = dr.Item([Ô]CLIENTE[Ô]).ToString
FlexGrid.Item(3, l).Value = dr.Item([Ô]CELULAR[Ô]).ToString
FlexGrid.Item(4, l).Value = dr.Item([Ô]FANTASIA[Ô]).ToString
End While
cmd.Dispose()
dr.Close()
End Using
End Using
End Using
End If
End Sub
1 - Use parametrização na sua query, não concatenação, que, aliás, está incorreta. O parâmetro [Ô]ORDER BY[Ô] precisa ser separado do apóstrofo do seu parâmetro concatenado.
2 - Não use FlexGrid, é um controle ActiveX e não tem porque ser usado com .NET, quando você tem um componente muito melhor, o DataGridView
3 - Tente usar OOP.
2 - Não use FlexGrid, é um controle ActiveX e não tem porque ser usado com .NET, quando você tem um componente muito melhor, o DataGridView
3 - Tente usar OOP.
Citação::
1 - Use parametrização na sua query, não concatenação, que, aliás, está incorreta. O parâmetro [Ô]ORDER BY[Ô] precisa ser separado do apóstrofo do seu parâmetro concatenado.
2 - Não use FlexGrid, é um controle ActiveX e não tem porque ser usado com .NET, quando você tem um componente muito melhor, o DataGridView
3 - Tente usar OOP.
Não use FlexGrid é apanas nomenclatura que user para o nome,
estou usando o DataGridView.
Tente usar OOP, por favor, dê apenas uma caminho das pedras.
Ok:
Para saber o que está acontecendo exatamente, todo seu procedimento deveria estar [Ô]protegido[Ô] por blocos try...catch. Com eles você conseguiria pegar a exceção que está acontecendo e onde. Tem vários pequenos problemas que podem ser a causa, você está fazendo dispose de objetos já coberto por blocos [Ô]using[Ô], como o objeto cmd por exemplo.
Para saber o que está acontecendo exatamente, todo seu procedimento deveria estar [Ô]protegido[Ô] por blocos try...catch. Com eles você conseguiria pegar a exceção que está acontecendo e onde. Tem vários pequenos problemas que podem ser a causa, você está fazendo dispose de objetos já coberto por blocos [Ô]using[Ô], como o objeto cmd por exemplo.
Citação::
Boa noite,
Só consigo popular a grid na primeira pesquisa, para fazer outra pesquisa, é necessário fechar o formulário.
ou seja, não preenche a grid conforme solicitado, porem, existe o cadastroPrivate Sub txt_FiltraNome_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles txt_FiltraNome.PreviewKeyDown
If e.KeyCode = Keys.Enter Then
Using con As FbConnection = GetConnection()
If ActionSelect = 0 Then
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
End If
If ActionSelect = 1 Then
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CPF LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
End If
Using cmd As New FbCommand(Sql_Cliente, con)
Using dr As FbDataReader = cmd.ExecuteReader()
FlexGrid.Rows.Clear()
Dim l As Integer
While dr.Read()
FlexGrid.Rows.Add()
FlexGrid.Item(0, l).Value = dr.Item([Ô]CODIGO[Ô]).ToString
FlexGrid.Item(1, l).Value = dr.Item([Ô]CPFCNPJ[Ô]).ToString
FlexGrid.Item(2, l).Value = dr.Item([Ô]CLIENTE[Ô]).ToString
FlexGrid.Item(3, l).Value = dr.Item([Ô]CELULAR[Ô]).ToString
FlexGrid.Item(4, l).Value = dr.Item([Ô]FANTASIA[Ô]).ToString
End While
cmd.Dispose()
dr.Close()
End Using
End Using
End Using
End If
End Sub
MOREIRA,
Percebo vários problemas no preenchimento da sua grid, mas o principal é a forma com que você está populando ela.
Existem várias formas de se popular uma grid, mas você deve estar tentando utilizar ela como se fosse o flexgrid do vb6, lamento, mas não é nem de perto o melhor modelo.
O primeiro erro na sua estruturá está na falta do incremento para a variável [Ô]I[Ô] que você definiu fora do bloco.
Dim l As Integer
While dr.Read()
FlexGrid.Rows.Add()
FlexGrid.Item(0, l).Value = dr.Item([Ô]CODIGO[Ô]).ToString
FlexGrid.Item(1, l).Value = dr.Item([Ô]CPFCNPJ[Ô]).ToString
FlexGrid.Item(2, l).Value = dr.Item([Ô]CLIENTE[Ô]).ToString
FlexGrid.Item(3, l).Value = dr.Item([Ô]CELULAR[Ô]).ToString
FlexGrid.Item(4, l).Value = dr.Item([Ô]FANTASIA[Ô]).ToString
End While
Onde ela está sendo incrementada?
O ideal Seria:
Dim l As Integer = 0
While dr.Read()
FlexGrid.Rows.Add()
FlexGrid.Item(0, l).Value = dr.Item([Ô]CODIGO[Ô]).ToString
FlexGrid.Item(1, l).Value = dr.Item([Ô]CPFCNPJ[Ô]).ToString
FlexGrid.Item(2, l).Value = dr.Item([Ô]CLIENTE[Ô]).ToString
FlexGrid.Item(3, l).Value = dr.Item([Ô]CELULAR[Ô]).ToString
FlexGrid.Item(4, l).Value = dr.Item([Ô]FANTASIA[Ô]).ToString
i += 1
End While
Da forma que estava, ele estava sobrescrevendo o registro 0, pois o mesmo não avançava.
O controle datagridview pode ser populado de diversas formas, como manualmente, adicionando linha a linha, ou passando um datasource a mesma (fonte de dados), que pode ser um list<t> de um objeto, um datatable, em fim, existem alternativas melhores da que você está fazendo.
Outros detalhes que o Kerplunk já destacou também estão influenciando para o não funcionamento, como não conter espaço entre o [ô] e o ORDER BY...
Além disso, há falta de parametrização na sua query, que pode evitar futuros problemas, como o uso do apóstrofo na pesquisa, além da prevenção de sql injection.
Sql_Cliente = ([Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô][Ô] & Me.txt_FiltraNome.Text + [Ô]%[Ô] & [Ô][ô]Order By CLIENTE ASC[Ô])
Amigos, para ser sincero, e perguntar não custa nada.. muito pelo contrario !
Como seria a melhor forma de parametrização essa query.
por favor,
Bem você tem nessa query um parâmetro apenas, então é bem simples, adicione o parâmetro no comando e o alias dele na query.
Tipo assim.
dim sql as string = [Ô][Ô]
sql = [Ô]Select * from tbcliente where cliente like @filtrarNome || [ô]%[ô][Ô]
Using cmd As New FbCommand(Sql_Cliente, con)
cmd.paramters.add([Ô]@filtrarNome[Ô], Me.txt_FiltraNome.Text)
Using dr As FbDataReader = cmd.ExecuteReader()
.......
Cara, tenta fazer dessa forma, usando classes;
Ai para chamar e preencher a datagridview:
Public Class Cliente
Public Id As integer
Public Propperty Cpf As String
Public Propperty Cliente As String
Public Propperty Celular As String
Public Propperty Fantasia As String
Public Sub New (_Id As Integer, _Cpf As String, _Cliente As String, _Celular As String, _Fantasia As String)
Me.Id = _Id
Me.Cpf = _Cpf
Me.Cliente = _Cliente
Me.Celular = _Celular
Me.Fantasia = _Fantasia
End Sub
Public Shared Function BuscarCliente(Valor As String) As List(of Cliente)
Dim Slq As String = [Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô]%[Ô] & Valor & [Ô]%[ô] Order By CLIENTE ASC;[Ô]
Dim result As New List(Of Cliente)
Try
Using conn As New MySqlConnection([Ô]Servidor[Ô])
Using cmd As New MySqlCommand(Slq, conn)
Try
conn.Open()
Catch ex As Exception
MsgBox([Ô]Houve um erro ao abrir uma conexão com o servidor[Ô] & vbNewLine & vbNewLine & ex.ToString)
End Try
Try
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
result.Add(New Cliente(rdr.Item([Ô]CODIGO[Ô]),
rdr.Item([Ô]CPFCNPJ[Ô]).ToString,
rdr.Item([Ô]CLIENTE[Ô]).ToString,
rdr.Item([Ô]CELULAR[Ô]).ToString))
End While
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Using
End Using
Catch ex As Exception
MsgBox([Ô]Houve um erro inesperado![Ô] & vbNewLine & vbNewLine & ex.ToString)
End Try
Return (result)
End Sub
End Class
Ai para chamar e preencher a datagridview:
Dim Conex As Cliente
Dim List = Conex.BuscarCliente(Me.txt_FiltraNome.Text)
For Each i As Cliente In List
DataGridView1.Rows.Add(i.Id, i.Cpf, i.Cliente, i.Celular, i.Fantasia)
End For
Citação::
Cara, tenta fazer dessa forma, usando classes;Public Class Cliente
Public Id As integer
Public Propperty Cpf As String
Public Propperty Cliente As String
Public Propperty Celular As String
Public Propperty Fantasia As String
Public Sub New (_Id As Integer, _Cpf As String, _Cliente As String, _Celular As String, _Fantasia As String)
Me.Id = _Id
Me.Cpf = _Cpf
Me.Cliente = _Cliente
Me.Celular = _Celular
Me.Fantasia = _Fantasia
End Sub
Public Shared Function BuscarCliente(Valor As String) As List(of Cliente)
Dim Slq As String = [Ô]SELECT * FROM TBCLIENTE WHERE CLIENTE LIKE [ô]%[Ô] & Valor & [Ô]%[ô] Order By CLIENTE ASC;[Ô]
Dim result As New List(Of Cliente)
Try
Using conn As New MySqlConnection([Ô]Servidor[Ô])
Using cmd As New MySqlCommand(Slq, conn)
Try
conn.Open()
Catch ex As Exception
MsgBox([Ô]Houve um erro ao abrir uma conexão com o servidor[Ô] & vbNewLine & vbNewLine & ex.ToString)
End Try
Try
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
result.Add(New Cliente(rdr.Item([Ô]CODIGO[Ô]),
rdr.Item([Ô]CPFCNPJ[Ô]).ToString,
rdr.Item([Ô]CLIENTE[Ô]).ToString,
rdr.Item([Ô]CELULAR[Ô]).ToString))
End While
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Using
End Using
Catch ex As Exception
MsgBox([Ô]Houve um erro inesperado![Ô] & vbNewLine & vbNewLine & ex.ToString)
End Try
Return (result)
End Sub
End Class
Ai para chamar e preencher a datagridview:Dim Conex As Cliente
Dim List = Conex.BuscarCliente(Me.txt_FiltraNome.Text)
For Each i As Cliente In List
DataGridView1.Rows.Add(i.Id, i.Cpf, i.Cliente, i.Celular, i.Fantasia)
End For
Só falta a parametrização.
Tópico encerrado , respostas não são mais permitidas