DataGridView WinForms Ricarica automatica / Aggiorna / Aggiorna

Ho un modulo di Windows con un controllo DataGridView .

L’ho associato a un file DB allegato (.mdf).

Eseguo l’inserimento generando un’istruzione di inserimento dynamic. Quindi pompare questa istruzione SQL in un object SqlCommand ed eseguire il metodo ExecuteNonQuery() . Tutto ciò viene eseguito gestendo un evento click sui Button . Il pulsante e il gridview si trovano sullo stesso modulo.

 Public Sub InsertRow(ByVal param1 As String, ByVal param2 As String, ByVal param3 As String) Dim strConn As String = (the connection string) Dim sqlConn As New SqlConnection(strConn) Dim insertSQL As String = "INSERT INTO theTable VALUES ('" + param1 + "', '" + param2 + "', '" + param3 + "', '" + DateTime.Now + "', '" + DateTime.Now + "')" Dim comm As New SqlCommand(insertSQL, sqlConn) sqlConn.Open() comm.ExecuteNonQuery() sqlConn.Close() End Sub Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsert.Click InsertRow("a","b","c") End Sub 

Dopo l’esecuzione del codice, DataGridView non viene aggiornato (rimane intatto). Devo uscire dal modulo e ricaricarlo per avere il gridview aggiornato.

Per determinati motivi, non posso usare l’object DataTable . Ma mi piacerebbe avere questo gridview aggiornato ogni volta che eseguo l’inserimento.

Qualcuno può dirmi come si fa? Grazie

PS Anche se lo sto facendo in VB, non mi dispiace ricevere risposta in C #

Prima di tutto, è necessario utilizzare SQLCommand e Parameters per evitare l’iniezione sql poiché si utilizza SQLClient spazio SQLClient nomi SQLClient . Prova questo come la tua procedura di Insert .

 Private Sub InsertSQL(ByVal param1 As String, ByVal param2 As String, ByVal param3 As String) Using sqlConn As New SqlConnection("ConnectionStringHere") Using sqlComm As New SqlCommand() sqlComm.Connection = sqlConn sqlComm.CommandType = CommandType.Text sqlComm.CommandText = "INSERT INTO theTable VALUES (@Param1,@Param2,@Param3,@Param4,@Param5)" With sqlComm.Parameters .AddWithValue("@Param1", param1) .AddWithValue("@Param2", param2) .AddWithValue("@Param3", param3) .AddWithValue("@Param4", Now) .AddWithValue("@Param5", Now) End With Try sqlConn.Open() sqlComm.ExecuteNonQuery() Catch ex As SqlException MsgBox(ex.Message.ToString, MsgBoxStyle.Exclamation, "Error No. " & ex.ErrorCode.ToString) Finally sqlConn.Close() End Try End Using End Using End Sub 

In secondo luogo, perché non preferisci usare DataTable per bind il tuo DataGridView ? Bene, ecco un’altra soluzione. È ny utilizzando SQLDataReader e devi SQLDataReader per mettere i record nella tua griglia.

 Private Sub ReloadGrid(ByVal connectionString As String) Dim queryString As String = "Your Query Here" Using connection As New SqlConnection(connectionString) Dim command As New SqlCommand(queryString, connection) connection.Open() Dim reader As SqlDataReader = command.ExecuteReader() DataGridView1.Rows.Clear() ' Clear All Rows ' While reader.Read() ' Console.WriteLine(String.Format("{0}, {1}", reader(0), reader(1))) ' ' Insert the record in your datagrid ' Dim row As String() = New String() {reader(0).ToString, reader(1).ToString, reader(2).ToString} DataGridView1.Rows.Add(row) End While ' Call Close when done reading. ' reader.Close() End Using End Sub 

se usi ADO.net usa il .EndEdit() / .Validate()

È necessario specificare una procedura o una funzione per essere responsabile del ricaricamento dei dati, è ansible utilizzare per effettuare una nuova chiamata ai metodi che si utilizzano per caricare i dati su datagrid.

 Public Sub InsertRow(ByVal param1 As String, ByVal param2 As String, ByVal param3 As String) Dim strConn As String = (the connection string) Dim sqlConn As New SqlConnection(strConn) Dim insertSQL As String = "INSERT INTO theTable VALUES ('" + param1 + "', '" + param2 + "', '" + param3 + "', '" + DateTime.Now + "', '" + DateTime.Now + "')" Dim comm As New SqlCommand(insertSQL, sqlConn) sqlConn.Open() comm.ExecuteNonQuery() sqlConn.Close() ReLoadData(grid) End Sub Private Sub btnInsert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnInsert.Click InsertRow("a","b","c") End Sub Private Sub ReloadData(ByVAl sender as DataGridView) ' Implement your data load function ' I use for example sender.datasource = GetTable() 'GetTable is a function that return a DataTable Object With my data sender.DataSource = Nothing 'Free the DataGridView DataSource property for enable row edition. End Sub 

è ansible impostare a livello di dataSource su null e impostare nuovamente l’origine dati effettiva per ricaricare la griglia.

ma il controllo si bloccherà per alcuni secondi .. (anche suspendLayout potrebbe non funzionare)

a parte questo non so come aggiornare .. anche se si aggiorna, si aggiorna ecc non aggiornerà il controllo datagrid una volta associato