+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 5 su 5

Discussione: DataGridView - Popolamento errato datagrig

  1. #1
    misonsan non è in linea Scolaretto
    Post
    191

    Unhappy DataGridView - Popolamento errato datagrig

    Ho una datagridView che viene popolata in maniera anomala.
    Il codice che uso è ananlogo a quello utilizzato per popolare altre 2 DataGridView della form, pertanto lo ritengo corretto.
    Penso che a questo punto il problema possa stare sulla tabella, ma non rilevo nessun'anomalia.
    Utilizzo Mdb Access Versione 2003

    i recordset estratti dalla tabella sono 2 e precisamente

    20170420_Record_x_DataGrid.jpg

    il Codice che uso è il seguente


    Private Sub EditaDtGrid2()

    Dim Strsql As String

    With DtGrid2
    .Rows.Clear()
    .Columns.Clear()
    End With

    Strsql = "SELECT W_CATEGORDINATO.Tipologia, W_CATEGORDINATO.NumProd, W_CATEGORDINATO.Valore" &
    " From W_CATEGORDINATO " &
    " WHERE (((W_CATEGORDINATO.IdCommanda)=" & Me.txt0k.Text & ")) " &
    " ORDER BY W_CATEGORDINATO.Tipologia "

    Conn = New OleDbConnection(ConnString)
    Conn.Open()
    Command = New OleDbCommand(Strsql, Conn)
    Try
    dr = Command.ExecuteReader()
    If dr.HasRows Then
    DtGrid2.AutoResizeRows(DataGridViewAutoSizeRowsMod e.AllCellsExceptHeaders)

    ' Set the column header style.
    Dim columnHeaderStyle As New DataGridViewCellStyle()

    columnHeaderStyle.BackColor = Color.Red
    columnHeaderStyle.Font = New Font("Verdana", 10, FontStyle.Bold)
    DtGrid2.ColumnHeadersDefaultCellStyle = columnHeaderStyle

    Dim dgvr As DataGridViewRow

    Strsql = "SELECT W_CATEGORDINATO.Tipologia as Voce, W_CATEGORDINATO.NumProd as [N Prod], W_CATEGORDINATO.Valore as [Imp]" &
    " From W_CATEGORDINATO " &
    " WHERE (((W_CATEGORDINATO.IdCommanda)=" & Me.txt0k.Text & ")) " &
    " ORDER BY W_CATEGORDINATO.Tipologia"

    Using Command As New OleDbCommand(Strsql, Conn)
    With Command
    ' ---------------------- Definizione / Assegnazione
    .Parameters.Add("@Tipologia", OleDbType.VarChar, 25)
    .Parameters.Add("@NumProd", OleDbType.Single) ' OleDbType.LongVarBinary
    .Parameters.Add("@Valore", OleDbType.Single)
    ' -------------------- ... altri Parametri
    End With
    dr = Command.ExecuteReader() ' dr As OleDbDataReader = Command.ExecuteReader
    'Lettura Campi DataReader
    For i As Integer = 0 To dr.FieldCount - 1
    DtGrid2.Columns.Add(dr.GetName(i).ToString, dr.GetName(i).ToString)
    Next


    Try
    'Lettura Campi Query
    While (dr.Read())
    dgvr = New DataGridViewRow
    dgvr.CreateCells(DtGrid2)
    For i As Integer = 0 To dr.FieldCount - 1
    dgvr.Cells(i).Value = dr(i).ToString()
    'Select Case i
    ' Case 2
    ' dgvr.Cells(i).Value = Convert.ToInt32(dr(i).ToString())
    ' Case Else
    ' dgvr.Cells(i).Value = dr(i).ToString()
    'End Select
    Next
    DtGrid2.Rows.Add(dgvr)
    End While
    Catch es As Exception
    MessageBox.Show("EditaDtGrid2-Loop - Errore " & Strsql, es.Message)
    Conn.Close()
    End Try
    ' formattazione delle celle

    End Using

    DtGrid2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnMode.AllCells
    Conn.Close()
    Else
    DtGrid2.ColumnCount = 1
    DtGrid2.ColumnCount = 1
    DtGrid2.ColumnHeadersVisible = True
    DtGrid2.AutoResizeColumnHeadersHeight()

    ' Resize all the row heights to fit the contents of all
    ' non-header cells.
    DtGrid2.AutoResizeRows(DataGridViewAutoSizeRowsMod e.AllCellsExceptHeaders)

    ' Set the column header style.
    Dim columnHeaderStyle As New DataGridViewCellStyle()

    columnHeaderStyle.BackColor = Color.Red
    columnHeaderStyle.Font = New Font("Verdana", 10, FontStyle.Bold)
    DtGrid2.ColumnHeadersDefaultCellStyle = columnHeaderStyle

    ' Set the column header names.
    DtGrid2.Columns(0).Name = "Riassunto Prodotti Ordinati"

    ' Populate the rows.
    Dim row1() As String = {"Nessuna Prodotto Ordinato !!!"}
    Dim rows() As Object = {row1}

    Dim rowArray As String()
    For Each rowArray In rows
    DtGrid2.Rows.Add(rowArray)
    Next rowArray

    DtGrid2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnMode.AllCells

    End If
    Catch es As Exception
    MessageBox.Show("EditaDtGrid2 - Errore " & Strsql, es.Message)
    Conn.Close()
    End Try

    End Sub
    Esegue una sola volta la While end while mentre dovrebbe farlo quanti sono i record della tabella e quindi, in questo caso 2 volte.

    Ribadisco che lo stesso codice viene utilizzato per popolare altre deu datagirdView presenti nella stessa form.
    Resto a disposizione per ogni altro eventuale chiarimento.
    Grazie

    Moreno

  2. #2
    L'avatar di gibra
    gibra ora è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,840
    Se tu usassi un DataTable ridurresti notevolmente il codice che stai usando.
    Soprattutto non capisco perché fare due query per caricare un DataGridView.
    Perché una non è sufficiente?

    Guarda il mio esempio VB.NET-OleDb2008 che vedi in firma.

  3. #3
    misonsan non è in linea Scolaretto
    Post
    191
    Ciao Gibra

    sei semplicemente fantastico
    Con l'esempi che mihai postato ho risolto in maniera più semplicee con pochissimo codice.
    Analizzando comunque il risultato del caricamento della DataGridView, trovo che manca un record, ma andando in debug i record estratti sono correttamente.
    Posto qui il codice che ho usato e i risultati.


    Private Sub EditaDtGrid4()

    ' declare DataTable
    Dim dt As DataTable = New DataTable()
    Dim Strsql As String = ""

    Strsql = "SELECT W_MONEYDAY.ProgMoney, W_MONEYDAY.Taglia, W_MONEYDAY.NroPezziAttuali, W_MONEYDAY.ImpAttuali " &
    " FROM W_MONEYDAY " &
    " ORDER BY W_MONEYDAY.Ordin"


    Using Conn As OleDbConnection = New OleDbConnection(ConnString)
    Try
    ' open connection
    Conn.Open()

    ' --------------------------------------------------------------
    'Dim aCommand As OleDbCommand = connJET.CreateCommand()
    'aCommand.CommandType = CommandType.StoredProcedure
    'aCommand.CommandText = "[Authors1]" '"[All Titles]"
    ' --------------------------------------------------------------
    ' create the command object and store the sql query
    Command = New OleDbCommand(Strsql, Conn)

    ' create the datareader object to connect to table
    Using aReader As OleDbDataReader = Command.ExecuteReader()
    dt.Load(aReader)
    End Using

    If (dt.Rows.Count > 0) Then
    DtGrid4.DataSource = dt
    End If

    DtGrid4.Columns(0).Visible = False

    Catch ex As Exception
    MessageBox.Show(ex.Message)
    End Try
    End Using

    End Sub

    il risultato che ottengo dopo il popolamento della DataGridView è il seguente

    20170421_DataGrid4.jpg

    i dati che estraggo dalla query sono i seguenti

    20170421_Query_x_DataGrid4.jpg

    come vedi dal confronto tra la query e i dati visibili nella DataGridView manca il record relativo alla pezzatura da 5 €.
    Ho provato a mettere in debug il codice e vedo che il dt.Rows.Count visualizza 6 record (che sono i record corretti estratti dalla Query),
    mentre ne edita nella DatagridView 5 (Manca quello da 5 €)


    20170421_NumRecQuery.jpg

    Puoi capire il motivo di tale comportamento e come posso gestirlo ?

    Grazie

    Moreno

  4. #4
    L'avatar di gibra
    gibra ora è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,840
    Infatti è strano.
    A meno che tu non abbia un filtro 'da qualche parte' come usavi prima.
    Scusa, ma l'order by è impostato correttamente sul campo Ordin ?

    ORDER BY W_MONEYDAY.Ordin

    P.S. Non è che hai la proprietà del database impostata su Copia sempre in cartella DEBUG (o qualcosa di simile, non ricordo bene)

  5. #5
    misonsan non è in linea Scolaretto
    Post
    191

    Unhappy

    ciao Gibra

    dal codice che ho riportato nella precedente risposta, mi par sia chiaro che eseguo l'ordinamento in maniera corretto.
    Proverò a ricontrollare il codice, ma non penso di trovare qualcosa di diverso.
    Mi par di capire che anche pewr te il codice è corretto.
    Il progetto è impostato su Debug.
    Grazie

    Moreno


    se riesci a farti venire qualche idea.
    Non c'è qualche comando per fare un "Refresh" ? del datasource ?

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi