Dopo due anni di lavoro credo di aver scoperto un grave malfunzionamento nel Controllo <BindingSource> di VisualStudio 2005.
Per una sicura conferma ho implementato il programma di prova esposto di seguito da cui è possibile rilevare dove e come si verifica.
La finestra di DataEntry è composta da una Form contenente:
• 3 controlli TextBox per la visualizzazione e inserimento dei dati
• 1 controllo CheckBox per impostare lo stato di sospensione dei record
• 1 controllo DataGridView per visualizzare la lista dei record
• 1 controllo BindingNavigator per operare la navigazione tra i record e i comandi di Inserimento, Modifica e Cancellazione dei dati
• 1 controllo BindingSource per gestire il contenuto della Tabella
Il programma è volutamente semplificato in modo da lasciare tutta la gestione della procedura ai due controlli BindingSource e BindingNavigator debitamente collegati.
Il controllo DataGridView è stato utilizzato solamente per visualizzare il risultato delle varie operazioni.
I pulsanti standard del BindingNavigator controllano l'Inserimento o la Cancellazione di una riga.
La riga di programma evidenziata in giallo è causa del malfunzionamento.
Public Class Form6
Dim strConn As String =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\database\Vendite.mdb"
Dim cn As OleDb.OleDbConnection ' Connessione
Dim ds As DataSet ' Data Set
Dim da As OleDb.OleDbDataAdapter ' DataAdapter
Sub New()
' Chiamata richiesta da Progettazione Windows Form.
InitializeComponent()
' Aggiungere le eventuali istruzioni di inizializzazione
' dopo la chiamata a InitializeComponent().
ds = New
da = New OleDb.OleDbDataAdapter("SELECT * FROM Prodotti", strConn)
da.Fill(ds, "Prodotti")
End Sub
Private Sub Form6_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
' collega binding al dataset sulla tabella Prodotti
With BindingSource
.DataSource = ds.Tables("Prodotti")
.Sort = "NomeProdotto ASC"
End With
txtId.DataBindings.Add("Text", BindingSource, "IDProdotto")
txtProdotto.DataBindings.Add("Text", BindingSource, "NomeProdotto")
txtConfezione.DataBindings.Add("Text", BindingSource, "QuantitàPerUnità")
txtPrezzo.DataBindings.Add("InputText", BindingSource, "PrezzoUnitario")
[color=#FF0000]Questa è la riga incriminata[/color]
chkSospeso.DataBindings.Add("Checked", BindingSource, "Sospeso")
' Collega Navigatore Utenti
BindingNavigator.BindingSource = BindingSource
' Collega DataGrid
With DataGridView
.DataSource = BindingSource
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.AllowUserToOrderColumns = False
.AllowUserToResizeColumns = False
.AllowUserToResizeRows = False
.ReadOnly = True
.RowHeadersVisible = False
' MODALITA' DI SELEZIONE
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.MultiSelect = False
' LAYOUT
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None
With .RowTemplate
.Height = 18
.MinimumHeight = 18
.Resizable = DataGridViewTriState.False
End With
.Columns("IDProdotto").Visible = False
.Columns("IDFornitore").Visible = False
.Columns("IDCategoria").Visible = False
.Columns("Scorte").Visible = False
.Columns("QuantitàOrdinata").Visible = False
.Columns("LivelloDiRiordino").Visible = False
End With
End Sub
End Class
Collegando in Binding il controllo CheckBox si vuole poter inserire o meno un flag il cui scopo è quello di evidenziare lo stato (Sospeso/Attivo) del prodotto relativo.
• Con la suddetta riga esclusa (Commentata) gli Inserimenti di nuove righe vanno perfettamente a buon fine (ad ogni pressione sul tasto il cursore del DataGridView si sposta correttamente sul nuovo record inserito all'ultima riga e trasferisce il contenuto di questa riga nei relativi controlli collegati. Inserendo i nuovi dati nei controlli TextBox vengono correttamente inseriti nella nuova riga secondo le specifiche dell'ordinamento.
• Con la suddetta riga inserita, la pressione sul tasto lascia il cursore del DataGridView nella posizione in cui si trova e tutti i nuovi dati eventualmente inseriti sovrascrivono i dati della posizione corrente.
Dopo svariate prove, ho potuto constatare che solo i controlli CheckBox e OptionBox provocano questo malfunzionamento quando collegati in Binding da programma.
P.S. Nelle guide di Visual Studio non ho trovato nessuna specifica in tal senso.