Salve,
Prom ha scritto:
Forse ma il problema che dal databse non prelevo tutti i campi ma solo quelli che mi servono...
non esiste un modo per non visualizzare il refresch e poi riattivarlo alla fine..??
Grazie per la tua risposta....
oltre a quanto ha gia' detto @Oregon circa il fatto di specificare nella proiezione le colonne che effettivamente ti servono, puoi anche specificare a runtime specificando, prima di assegnare il recordset al datasource, che vorrai indicare "nominalmente" e non accettando l'autogenerazione, quindi aggiungerai le colonne a te interessanti come desiderato... considera ad esempio che a te serva qualche cosa come
SELECT [Id], [Descrizione], [IdTabellaReferenziata], [Prezzo], [Quantita] FROM xxxx;
mentre la tua datagridview dovra' mostrare "solo" la [Descrizione], il "riferimento" alla tabella referenziata, [Prezzo] e [Quantita], ed inoltre un'ulteriore colonna con un "dato ricalcolato" a runtime dato da [Prezzo] x [Quantita]...
la colonna [Id] ti servira' poi ovviamente per effettuare gli aggiornamenti alla base dati, ma ripeto, "non la vuoi vedere"..
come concetto, quindi trivialmente, definirai ad esempio un metodo per ottenere i tuoi dati che alimentano la datagridview, un metodo che alimenta il combobox presente nella griglia popolata dalla tabella referenziata... poi definirai quali colonne vuoi aggiungere alla griglia e implementi l'evento CellFormatting per popolare a runtime una colonna calcolata...
qualche cosa simile a
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DefineDGV()
End Sub
#Region "#--- DATA methods ---#"
Private Function GRD_GetMainData() As DataTable
'ottieni un datatable / dataview o una POCO list per alimentare la datagridview
'SELECT [Id], [Descrizione], [IdTabellaReferenziata], [Prezzo], [Quantita] FROM xxxx;
End Function
Private Function GRD_GetAvailableProducts2Reference() As DataTable
'ottieni un datatable / dataview o una POCO list per popolare il combo
End Function
#End Region
#Region "#--- Private methods ---#"
Private Sub DefineDGV()
With DataGridView1
.SuspendLayout()
If .IsCurrentCellInEditMode Then .CancelEdit()
.DataSource = Nothing
.Columns.Clear()
.AutoGenerateColumns = False ' definizione manuale delle colonne
Dim tCol As New System.Windows.Forms.DataGridViewTextBoxColumn
tCol = New System.Windows.Forms.DataGridViewTextBoxColumn
With tCol
.DataPropertyName = "Descrizione"
.Name = "Descrizione"
.HeaderText = "Descrizione"
.Resizable = System.Windows.Forms.DataGridViewTriState.True
.Width = 110
.MaxInputLength = 100
.MinimumWidth = 100
.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic
.ReadOnly = False
.ToolTipText = "Descrizione del prodotto"
.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft
End With
.Columns.Add(tCol)
tCol = Nothing
'tabella referenziata dal "catalogo prodotti" per selezione tramite combobox
Dim cboCol As New System.Windows.Forms.DataGridViewComboBoxColumn
cboCol = New System.Windows.Forms.DataGridViewComboBoxColumn
With cboCol
.DataPropertyName = "IdTabellaReferenziata"
.Name = "IdTabellaReferenziata"
.HeaderText = "Prodotto"
.DisplayMember = "Colonna_tabella_referenziata_da_VISUALIZZARE"
.ValueMember = "ID_tabella_referenziata_da_salvare_nella_riga"
'ottieni un datatable / dataview o una POCO list per popolare il combo
.DataSource = GRD_GetAvailableProducts2Reference()
.Resizable = System.Windows.Forms.DataGridViewTriState.True
.Width = 80
.MinimumWidth = 40
.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable
.ReadOnly = False
.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.NotSet
.ToolTipText = "Scelta del prodotto selezionato"
.FlatStyle = System.Windows.Forms.FlatStyle.Flat
.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft
End With
.Columns.Add(cboCol)
cboCol = Nothing
tCol = New System.Windows.Forms.DataGridViewTextBoxColumn
With tCol
.DataPropertyName = "Prezzo"
.Name = "Prezzo"
.HeaderText = "Prezzo Unitario"
.Resizable = System.Windows.Forms.DataGridViewTriState.False
.Width = 70
.MaxInputLength = 10
.MinimumWidth = 40
.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable
.ReadOnly = False
.ToolTipText = "Prezzo Unitario del prodotto MANUALE e NON preso dalla tabella prodotti"
.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight
.DefaultCellStyle.Format = "#,#.00"
End With
.Columns.Add(tCol)
tCol = Nothing
tCol = New System.Windows.Forms.DataGridViewTextBoxColumn
With tCol
.DataPropertyName = "Quantita"
.Name = "Quantita"
.HeaderText = "Quantità"
.Resizable = System.Windows.Forms.DataGridViewTriState.False
.Width = 70
.MaxInputLength = 5
.MinimumWidth = 40
.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable
.ReadOnly = False
.ToolTipText = "Quantità di prodotto acquistata"
.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight
.DefaultCellStyle.Format = "#,0"
End With
.Columns.Add(tCol)
tCol = Nothing
'questa colonna viene ricalcolata a runtime
tCol = New System.Windows.Forms.DataGridViewTextBoxColumn
With tCol
.Name = "RICALCOLO_MANUALE"
.HeaderText = "Pr.Totale Ricalcolato"
.Resizable = System.Windows.Forms.DataGridViewTriState.False
.Width = 70
.MaxInputLength = 0
.MinimumWidth = 40
.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable
.ReadOnly = True
.ToolTipText = "Prezzo Totale NETTO (IVA Scorporata)"
.DefaultCellStyle.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleRight
.DefaultCellStyle.BackColor = System.Drawing.SystemColors.InactiveCaption
.DefaultCellStyle.ForeColor = System.Drawing.SystemColors.InactiveCaptionText
.DefaultCellStyle.Format = "#,#.00"
End With
.Columns.Add(tCol)
tCol = Nothing
.AllowUserToOrderColumns = False ' <- come ti serve
.AllowUserToAddRows = True ' <- come ti serve
.AllowUserToDeleteRows = True ' <- come ti serve
.AllowUserToResizeRows = False ' <- come ti serve
.ResumeLayout()
.DataSource = GRD_GetMainData()
End With
End Sub
#End Region
#Region "#--- Events ---#"
Private Sub DataGridView1_CellFormatting(sender As Object, e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
If Not CType(sender, System.Windows.Forms.DataGridView).DataSource Is Nothing AndAlso e.RowIndex >= 0 Then
If Not Me.DataGridView1.Rows(e.RowIndex).DataBoundItem Is Nothing AndAlso e.ColumnIndex = Me.DataGridView1.Columns("RICALCOLO_MANUALE").Index Then
Dim dc As Decimal = CType(DataGridView1.Rows(e.RowIndex).DataBoundItem, DataRow)("Prezzo") * CType(DataGridView1.Rows(e.RowIndex).DataBoundItem, DataRow)("Quantita")
e.Value = dc
e.FormattingApplied = True
End If
End If
End Sub
#End Region
End Class
qualche cosa di simile, quindi...
salutoni
--
Andrea