View Full Version : [vb.net] Svuotare un Datagrid
mangzeus
16-12-2004, 15:20
Come faccio a svuotare un datagrid???
esempio io faccio una select su un'origine dati (file mdb) sulla quale ci sono dei parametri di ricerca. La ricerca sulla tabella viene fatta tante volte e se prima di fare una nuova ricerca io non svuoto la tabella mi visualizza i record doppi sulla tabella...posto le mie righe di codice..
Dim sql As String
If RbtnArticolo.Checked = True Then
sql = "SELECT Articolo, [Codice Articolo], Prezzo, Descrizione FROM Articoli where Articolo= '" & txtRicerca.Text & "'"
ElseIf RbtnCodArticolo.Checked = True Then
sql = "SELECT [Codice Articolo], Articolo, Prezzo, Descrizione FROM Articoli where [Codice Articolo]= '" & txtRicerca.Text & "'"
ElseIf RbtnPrezzo.Checked = True Then
sql = "SELECT [Codice Articolo], Articolo, Prezzo, Descrizione FROM Articoli where Prezzo= '" & txtRicerca.Text & "'"
End If
ConnettiDb(Cn, NomeDB, "Admin", "")
PopolaTabella(dsRicerca, daRicerca, Cn, sql, "TblRicerca")
DgridArticoli.DataSource = dsRicerca
DgridArticoli.DataMember = "TblRicerca"
DisconnettiDb(Cn)
io adesso dovrei svuotare l'oggetto DgridArticoli per poter effettuare una ricerca nuova, altrimenti mi si visualizzano record doppi...come faccio??
mangzeus
16-12-2004, 15:42
ho risolta mettendo all'inizio della sub daArticoli.clear
Praticamente ho svuotato il dataset...
lAdesso mi viene il dubbio che qualcosa resti aperto in memoria...
mangzeus
16-12-2004, 16:06
Sembra che in memoria non abbia più niente...quindi ok...
solo una cosa però....se io effettuo una ricerca per Articolo ovviamente mi viene fuori il record con i campi in questa sequenza come da select
Articolo - Cod Articolo - Prezzo - Descrizione
se io faccio un'altra ricerca sullo stesso prezzo dell'articolo ricercato prima (quello che adesso ho in visualizzazione) non mi riordina i campi in modo Prezzo - Articolo - Codice Articolo - Descrizione
ma rimangono tali e quali a prima cioè
Articolo - Cod Articolo - Prezzo - Descrizione
qualcuno saprebbe spiegarmi il motivo??
mangzeus
20-12-2004, 09:49
Faccio un'atra domanda...
Nella mia applicazione c'è la posibilità di cancellare una riga in un datagrid con queste istruzioni:
Dim RemoveRow As DataRow
'assegno il valore a rowindex e quindi alla riga del datagrid selezionata.
RowIndex = DgridArticoli.CurrentRowIndex
'inizializzo la datatable.
TableArticoli = dsArticolo.Tables("TblArticoli")
'assegno il datarow alla tabella
RemoveRow = TableArticoli.Rows(RowIndex)
'rimuovo la riga selezionata nel datagrid.
'With TableArticoli.Rows(RowIndex)
' .Item("Articolo") = ""
RemoveRow.Delete()
'End With
come faccio per cancellare più righe assieme???c'è una proprietà o metodo del datagrid che mi ritorni l'insieme di righe selezionate??
Brigante
21-12-2004, 08:40
Originariamente inviato da mangzeus
Come faccio a svuotare un datagrid???
esempio io faccio una select su un'origine dati (file mdb) sulla quale ci sono dei parametri di ricerca. La ricerca sulla tabella viene fatta tante volte e se prima di fare una nuova ricerca io non svuoto la tabella mi visualizza i record doppi sulla tabella...posto le mie righe di codice..
Dim sql As String
If RbtnArticolo.Checked = True Then
sql = "SELECT Articolo, [Codice Articolo], Prezzo, Descrizione FROM Articoli where Articolo= '" & txtRicerca.Text & "'"
ElseIf RbtnCodArticolo.Checked = True Then
sql = "SELECT [Codice Articolo], Articolo, Prezzo, Descrizione FROM Articoli where [Codice Articolo]= '" & txtRicerca.Text & "'"
ElseIf RbtnPrezzo.Checked = True Then
sql = "SELECT [Codice Articolo], Articolo, Prezzo, Descrizione FROM Articoli where Prezzo= '" & txtRicerca.Text & "'"
End If
ConnettiDb(Cn, NomeDB, "Admin", "")
PopolaTabella(dsRicerca, daRicerca, Cn, sql, "TblRicerca")
DgridArticoli.DataSource = dsRicerca
DgridArticoli.DataMember = "TblRicerca"
DisconnettiDb(Cn)
io adesso dovrei svuotare l'oggetto DgridArticoli per poter effettuare una ricerca nuova, altrimenti mi si visualizzano record doppi...come faccio??
Anch'io ho fatto un programma di un piccolo archivio e i record doppi non me li visualizza, ad ogni ricerca la datagrid restituisce correttamente SOLO i record che soddisfano la ricerca; ti faccio vedere il mio codice per popolare la datagrid:
Private Sub PopolaDataGrid()
' Popola la datagrid.
Dim dSet As New System.Data.DataSet
Dim dTable As New System.Data.DataTable
Dim dAdpt As New System.Data.OleDb.OleDbDataAdapter(sSQL, Conn)
dAdpt.Fill(dSet, "NOME_DATATABLE")
dtgNE.DataSource = dSet.Tables(0)
lblRecordRestituiti.Text = dSet.Tables(0).Rows.Count() & " record trovati"
End Sub
A posto della variabile sSQL metti la tua stringa SQL; Conn rappresenta la Connection al database. Se cambi la stringa SQL e riesegui il codice la dadatagrid si aggiornerà con i nuovi record. Non devi fare il clear del DataSet, perchè cancelli tutte le righe! Ricordati poi alla fine di chiudere la connessione!
Comunque, per effettuare delle ricerche o filtri all'interno di un dataset bisogna utilizzare il metodo Select e non fare ogni volta una query sulla fonte dati, altrimenti si perde il senso di lavorare con ADO.NET in modalità disconnessa.
Brigante
21-12-2004, 08:50
Originariamente inviato da mangzeus
Sembra che in memoria non abbia più niente...quindi ok...
solo una cosa però....se io effettuo una ricerca per Articolo ovviamente mi viene fuori il record con i campi in questa sequenza come da select
Articolo - Cod Articolo - Prezzo - Descrizione
se io faccio un'altra ricerca sullo stesso prezzo dell'articolo ricercato prima (quello che adesso ho in visualizzazione) non mi riordina i campi in modo Prezzo - Articolo - Codice Articolo - Descrizione
ma rimangono tali e quali a prima cioè
Articolo - Cod Articolo - Prezzo - Descrizione
qualcuno saprebbe spiegarmi il motivo??
Con il codice che ti ho dato dovresti eleiminare anche questo problema.
Brigante
21-12-2004, 09:03
Originariamente inviato da mangzeus
Faccio un'atra domanda...
Nella mia applicazione c'è la posibilità di cancellare una riga in un datagrid con queste istruzioni:
Dim RemoveRow As DataRow
'assegno il valore a rowindex e quindi alla riga del datagrid selezionata.
RowIndex = DgridArticoli.CurrentRowIndex
'inizializzo la datatable.
TableArticoli = dsArticolo.Tables("TblArticoli")
'assegno il datarow alla tabella
RemoveRow = TableArticoli.Rows(RowIndex)
'rimuovo la riga selezionata nel datagrid.
'With TableArticoli.Rows(RowIndex)
' .Item("Articolo") = ""
RemoveRow.Delete()
'End With
come faccio per cancellare più righe assieme???c'è una proprietà o metodo del datagrid che mi ritorni l'insieme di righe selezionate??
A questa domanda non so ancora darti una risposta, essendo anch'io ancora alle prime armi con la DataGrid di VB.NET, comunque appena so qualcosa te lo dico.
;)
mangzeus
21-12-2004, 10:34
Originariamente inviato da Brigante
Anch'io ho fatto un programma di un piccolo archivio e i record doppi non me li visualizza, ad ogni ricerca la datagrid restituisce correttamente SOLO i record che soddisfano la ricerca; ti faccio vedere il mio codice per popolare la datagrid:
Private Sub PopolaDataGrid()
' Popola la datagrid.
Dim dSet As New System.Data.DataSet
Dim dTable As New System.Data.DataTable
Dim dAdpt As New System.Data.OleDb.OleDbDataAdapter(sSQL, Conn)
dAdpt.Fill(dSet, "NOME_DATATABLE")
dtgNE.DataSource = dSet.Tables(0)
lblRecordRestituiti.Text = dSet.Tables(0).Rows.Count() & " record trovati"
End Sub
A posto della variabile sSQL metti la tua stringa SQL; Conn rappresenta la Connection al database. Se cambi la stringa SQL e riesegui il codice la dadatagrid si aggiornerà con i nuovi record. Non devi fare il clear del DataSet, perchè cancelli tutte le righe! Ricordati poi alla fine di chiudere la connessione!
Comunque, per effettuare delle ricerche o filtri all'interno di un dataset bisogna utilizzare il metodo Select e non fare ogni volta una query sulla fonte dati, altrimenti si perde il senso di lavorare con ADO.NET in modalità disconnessa.
grazie....cosa intendi per "Utilizzare sempre ilo metodo select??mi potresti fare un esempio" cioè io non dovrei ogni volta chiudere e riaprire la connessione e fare una select quando voglio fare una ricerca??
mangzeus
21-12-2004, 10:37
Originariamente inviato da Brigante
A questa domanda non so ancora darti una risposta, essendo anch'io ancora alle prime armi con la DataGrid di VB.NET, comunque appena so qualcosa te lo dico.
;)
perchè io per popolare una tabella uso questa funzione: ecco perchè ogni volta specifico la stringa di connessione...
Public Sub PopolaTabella(ByVal ds As Data.DataSet, ByVal da As OleDb.OleDbDataAdapter, ByVal cn As OleDb.OleDbConnection, ByVal Query As String, ByVal NomeTbl As String, Optional ByVal CaricaCommand As Boolean = True, Optional ByVal PerInnerjoin As Boolean = False)
Try
If cn.State = ConnectionState.Closed Then ConnettiDb(cn, NomeDB, "Admin")
If cn.State = ConnectionState.Open Then
da.SelectCommand = New OleDb.OleDbCommand(Query, cn)
da.SelectCommand.Connection = cn
da.SelectCommand.ExecuteNonQuery()
da.Fill(ds, NomeTbl)
'Aggiunge un oggetto DataTable a un DataSet e configura lo schema affinché corrisponda a quello dell'origine dati
da.FillSchema(ds, SchemaType.Mapped)
If CaricaCommand Then
Dim CmbBld As New OleDb.OleDbCommandBuilder(da)
'era per queste due istruzioni che non funzionava...access le richiede
CmbBld.QuotePrefix = "["
CmbBld.QuoteSuffix = "]"
da.DeleteCommand = CmbBld.GetDeleteCommand
da.InsertCommand = CmbBld.GetInsertCommand
da.UpdateCommand = CmbBld.GetUpdateCommand
End If
End If
Catch err As OleDb.OleDbException
MsgBox(err.Message & " " & err.ErrorCode, MsgBoxStyle.Critical, "Errore...")
Finally
If cn.State = ConnectionState.Open Then cn.Close()
End Try
End Sub
io così popolo una taabella e poi non in funzione popolo il datagrid...
mangzeus
21-12-2004, 11:05
Grande funziona...
Private Sub PopolaDataGrid(ByVal sql As String)
' Popola la datagrid.
Dim dSet As New System.Data.DataSet
Dim dTable As New System.Data.DataTable
Dim dAdpt As New System.Data.OleDb.OleDbDataAdapter(sql, Cn)
dAdpt.Fill(dSet, "NOME_DATATABLE")
DgridArticoli.DataSource = dSet.Tables(0)
Label1.Text = dSet.Tables(0).Rows.Count() & " record trovati"
End Sub
mi faresti un esempio per usare il metodo select e quindi lavorare in modalità disconnessa??
Brigante
21-12-2004, 11:42
Al metodo Select devi passargli la stringa del filtro. Sto cominciando ad utilizzarlo anch'io quindi ti rimando alla MSDN Library online (in italiano) che tratta l'argomento: QUI (http://msdn.microsoft.com/library/ITA/vbcon/html/vboriDatasetFilteringSorting.asp).
mangzeus
21-12-2004, 12:10
Originariamente inviato da Brigante
Al metodo Select devi passargli la stringa del filtro. Sto cominciando ad utilizzarlo anch'io quindi ti rimando alla MSDN Library online (in italiano) che tratta l'argomento: QUI (http://msdn.microsoft.com/library/ITA/vbcon/html/vboriDatasetFilteringSorting.asp).
ho trovato il metodo più o meno solo che adesso non so come assegnarlo ad un datagrid io ho fatto così:
Dim sql As String
sql = "SELECT Articolo, [Codice Articolo], Prezzo, Descrizione FROM Articoli"
ConnettiDb(Cn, NomeDB, "Admin", "")
PopolaTabella(dsArticolo, daArticolo, Cn, sql, "TblArticoli")
DgridArticoli.DataSource = dsArticolo
DgridArticoli.DataMember = "TblArticoli"
DisconnettiDb(Cn)
'dichiaro il datarow delle righe trovate
Dim foundRows() As DataRow
Dim i As Integer
foundRows = dsArticolo.Tables("TblArticoli").Select("Articolo='a'")
'questo mi indica che ha trovato una riga quindi è giusto perche nel mio database ho una riga dove l'Articolo=a
i = foundRows.Length()
'poi qui sto provando a mettere il datarow nel datagrid trasformandolo in dataset ma mi da errore, non ci riesco...
Dim pippo As DataSet
pippo = New DataSet
pippo.Tables.Add(New DataTable("pluto"))
'pippo.Tables(0).Rows.Add()
DgridArticoli.DataSource = foundRows
Dim a As Integer
pipozzolo
23-12-2004, 07:31
Originariamente inviato da mangzeus
Faccio un'atra domanda...
Nella mia applicazione c'è la posibilità di cancellare una riga in un datagrid con queste istruzioni:
Dim RemoveRow As DataRow
'assegno il valore a rowindex e quindi alla riga del datagrid selezionata.
RowIndex = DgridArticoli.CurrentRowIndex
'inizializzo la datatable.
TableArticoli = dsArticolo.Tables("TblArticoli")
'assegno il datarow alla tabella
RemoveRow = TableArticoli.Rows(RowIndex)
'rimuovo la riga selezionata nel datagrid.
'With TableArticoli.Rows(RowIndex)
' .Item("Articolo") = ""
RemoveRow.Delete()
'End With
come faccio per cancellare più righe assieme???c'è una proprietà o metodo del datagrid che mi ritorni l'insieme di righe selezionate??
Inserisci nel datagrid una templatecolumn contenente un checkbox, sotto il datagrid aggungi un pulsante Elimina che per ogni riga del datagrid con il checkbox selezionato esegue il codice da te postato.
mangzeus
23-12-2004, 08:56
Originariamente inviato da pipozzolo
Inserisci nel datagrid una templatecolumn contenente un checkbox, sotto il datagrid aggungi un pulsante Elimina che per ogni riga del datagrid con il checkbox selezionato esegue il codice da te postato.
come faccio ad inserire questa templatecolumn??potresti farmi un esempio a codice??
pipozzolo
23-12-2004, 09:21
Originariamente inviato da mangzeus
come faccio ad inserire questa templatecolumn??potresti farmi un esempio a codice??
Uhm ma lo stai usando in una pagina aspx o in un'applicazione standard?
mangzeus
23-12-2004, 09:30
Originariamente inviato da pipozzolo
Uhm ma lo stai usando in una pagina aspx o in un'applicazione standard?
in una applicazione standard??è un casino??
pipozzolo
23-12-2004, 09:34
Originariamente inviato da mangzeus
in una applicazione standard??è un casino??
Ehm io so come si fa in una pagina aspx, in un'applicazione standard dovrebbe essere abbastanza simile.
Però non ti posso aiutare :(
Non si possono inserire le checkbox in un dg vb.net?
mangzeus
23-12-2004, 09:54
Originariamente inviato da pipozzolo
Ehm io so come si fa in una pagina aspx, in un'applicazione standard dovrebbe essere abbastanza simile.
Però non ti posso aiutare :(
Non si possono inserire le checkbox in un dg vb.net?
non penso sai...non lo so...non ne ho idea...Avessi una proprietà del datagrid che mi ritorni il numero di righe selezionate non sarebbe un problema perchè le inserisco nel datarow e poi cancello il datarow direttamente ed è fatta. SOlo che l'unica proprietà del datagrid che mi risulta utile è la .currentrowindex ma ritorna solo una riga selezionata.
Brigante
23-12-2004, 11:21
Ho trovato questa funzione, ma è da provare, restituisce una classe ArrayList.
Public Function GetSelectedRows(ByVal dg As DataGrid) As System.Collections.ArrayList
Dim al As New ArrayList()
Dim cm As CurrencyManager = Me.BindingContext(dg.DataSource, dg.DataMember)
Dim dv As DataView = CType(cm.List, DataView)
Dim i As Integer
For i = 0 to dv.Count - 1
If dg.IsSelected(i) Then
al.Add(i)
End If
End Next
Return al
End Function
mangzeus
24-12-2004, 08:42
Originariamente inviato da Brigante
Ho trovato questa funzione, ma è da provare, restituisce una classe ArrayList.
Public Function GetSelectedRows(ByVal dg As DataGrid) As System.Collections.ArrayList
Dim al As New ArrayList()
Dim cm As CurrencyManager = Me.BindingContext(dg.DataSource, dg.DataMember)
Dim dv As DataView = CType(cm.List, DataView)
Dim i As Integer
For i = 0 to dv.Count - 1
If dg.IsSelected(i) Then
al.Add(i)
End If
End Next
Return al
End Function
poi come faccio a cancellare le righe che prima utilizzavo il datarow con l'ArrayList come ci si comporta??
In Pratica come funziona questo CurrencyManager??
mangzeus
24-12-2004, 14:56
Originariamente inviato da mangzeus
poi come faccio a cancellare le righe che prima utilizzavo il datarow con l'ArrayList come ci si comporta??
In Pratica come funziona questo CurrencyManager??
grazie mille per la funzione anche se non ho capito bene come funziona a causa del CurrencyManager e se appena puoi cortesemente mi posti due righe di come funziona te ne sarei grato. Comunque grazie alla tua funzione riesco a cancellare più righe assieme con questo codice...
questa è la funziona
Public Function GetSelectedRows(ByVal dg As DataGrid) As System.Collections.ArrayList
Dim al As New ArrayList
Dim cm As CurrencyManager = Me.BindingContext(dg.DataSource, dg.DataMember)
Dim dv As DataView = CType(cm.List, DataView)
Dim i As Integer
For i = 0 To dv.Count - 1
If dg.IsSelected(i) Then
al.Add(i)
End If
Next
Return al
End Function
questa la sub dell'evento click del pulsante "Elimina"
Dim RemoveRow As DataRow
Dim riga As Integer
Dim numrighe As Integer
Dim drview As New ListBox
Dim a As Integer
Dim c As Integer
numrighe = GetSelectedRows(DgridArticoli).Count()
For a = 0 To numrighe - 1
riga = GetSelectedRows(DgridArticoli).Item(a)
drview.Items.Add(riga)
Next
For c = 0 To numrighe - 1
TableArticoli = dsArticolo.Tables("TblArticoli")
RemoveRow = TableArticoli.Rows(drview.Items(c))
RemoveRow.Delete()
Next
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.