+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

[VB2015] Aggiornamento DB Sql Server da DataGridView passando da altra form

  1. #1
    Sgrubak non è in linea Scribacchino
    Buonasera a tutti,

    ho un curioso problema che proprio non riesco a risolvere e spero qualcuno riesca a correggermi. Per essere il più chiaro possibile partirò dall'inizio:

    Ho una form con una dataGridView, una ComboBox e alcuni Pulsanti

    Nella form ho inoltre queste variabili

    Public Class Form2
    Private nomeServer As String = "(localdb)\MSSQLLocalDB"
    Private nomeDB As String = "Programmatore"
    Dim DT As New DataTable
    Public Adattatore As New SqlClient.SqlDataAdapter
    Public bindingSource1 As New BindingSource()
    Public macchinascelta As String


    Durante l'evento Load() viene inizializzata una combobox, popolandola con dei dati di una tabella de DB e viene riempita la mia DataGridView:

    Private Sub ScegliMacchina_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ScegliMacchina.SelectedIndexChanged

    Dim strCN As String = "Data Source=" & nomeServer & ";Initial Catalog=" & nomeDB &
    ";Integrated Security=SSPI;"

    Dim CN As New SqlClient.SqlConnection(strCN)
    Dim strSql As String = "SELECT * FROM Programma WHERE Macchina = '" & ScegliMacchina.Text.ToString & "' ORDER BY Riga"
    Dim CMD As New SqlClient.SqlCommand(strSql, CN)

    CN.Open()
    DT.Clear()

    Adattatore.SelectCommand = CMD
    Dim cmdBuilder = New SqlClient.SqlCommandBuilder(Adattatore)
    Adattatore.Fill(DT)
    Me.bindingSource1.DataSource = DT

    With dgvProg
    .DataSource = Me.bindingSource1
    .Refresh()
    End With

    CN.Close()
    End Sub


    Su di un pulsante ho inserito questo codice:

     Private Sub btnSalva_Click(sender As Object, e As EventArgs) Handles btnSalva.Click
    Me.Adattatore.Update(CType(Me.bindingSource1.DataSource, DataTable))
    End Sub


    Quindi se modifico i valori della DataGridView e poi salvo, il DB mi viene correttamente aggiornato.
    La fregatura arriva quando, per modificare la DGV utilizzo un altro pulsante che richiama una seconda Form.

     Private Sub btnSposta_Click(sender As Object, e As EventArgs) Handles btnSposta.Click
    Dim sposta As New frmSposta

    sposta.chiamante = Me
    sposta.ShowDialog(Me)
    If macchinascelta <> "" Then
    With Me.dgvProg
    .CurrentRow.Cells("Macchina").Selected = True
    .EditMode = DataGridViewEditMode.EditProgrammatically
    .BeginEdit(True)
    .CurrentRow.Cells("Macchina").Value = macchinascelta
    .EndEdit()
    .EditMode = DataGridViewEditMode.EditOnKeystroke
    End With
    sposta.Dispose()
    btnSalva_Click(Nothing, Nothing) 'Salvataggio
    dgvProg.Refresh() 'Refresh della DataGridView
    End If
    macchinascelta = ""
    End Sub


    In questo caso, la cella che voglio modificare della DGV viene modificata nel suo Value correttamente, ma i dati non vengono salvati. Ho controllato e il flusso passa correttamente dentro il btnSalva_Click ma non ha effetto. Se eseguo manualmente il click il DB viene aggiornato. Io vorrei effettuare salvataggio e refresh della DGV con un solo bottone.
    Ho tentato di di inserire al posto di
    btnSalva_Click(Nothing, Nothing)
    la riga presente nella routine ma non funziona.

    Qualcuno ha idea di dove debba intervenire? Grazie.

  2. #2
    Dev-01 non è in linea Scribacchino
    I gestori vanno popolati con entità valide non nulle.

    Il 'sender' è un oggetto, come anche l''xxxEventArgs'.

    A questo punto hai due strade:

    la prima (ad uso più informativo ma utilizzabile qualora si presentasse il bisogno di interrogare qualche proprietà del 'sender' all'interno della routine originaria):

    
    Private Sub MiaRoutine (etc., etc.; ...
    
    btnSalva_Click(Me.btnSalva, New EventArgs)
    
    End Sub
    
    L'altra (ampiamente consigliata perché maggiormente si allinea alle regole OOP):

    
    Private Sub MiaRoutine (etc., etc.; ...
    
     ' * Sostituisco btnSalva_Click(Me.btnSalva, New EventArgs) con la riga successiva che richiama direttamente l'apposita procedura.
    Salva()
    
    End Sub
    
    Private Sub btnSalva_Click(Byval sender As Object, Byval e As EventArgs)Handles btnSalva.Click
    
    ' * Sostituisco il codice che inserirò in una routine apposita che chiamo qui (come sopra):
    Salva()
    
    End Sub
    
    Private Sub Salva() ' * Accessibile a seconda dei limiti posti dai modificatori d'accesso scelti.
    
    ' * Codice relativo al salvataggio
    
    End Sub
    
    Ultima modifica di Dev-01; 24-06-2017 00:25 

  3. #3
    Sgrubak non è in linea Scribacchino
    Ciao Dev-01,

    ho seguito entrambi i tuoi suggerimenti e non ho cavato un ragno dal buco...

    La cosa che mi lascia perplesso è che la seconda form modifica correttamente il campo della cella nella prima form. Ne sono sicurissimo perché ho le espressioni di controllo in debug, che mi monitorano le variabili in gioco. Sempre grazie al debug sono sicuro che il codice entri nella routine Salva() e che passi su tutte le istruzioni una di fila all'altra. E sono pure sicuro che non mi salva sto database cattivo brutto e nero!

    Divertente è scoprire che se commento la chiamata a Salva(), e cliccko manualmente sul bottone, lui salva. Ne deduco che le istruzioni per il salvataggio sono corrette. Non capisco perché se la sub è chiamata dall'evento btnsalva.click funziona e se è chiamata dall'evento btnSposta.click non va...

    In preda alla disperazione ho tentato anche di passare da un'altra form, richiamata alla pressione del tasto F3 su una data cella della DataGridView (evento DataGridvView.KeyDown), ma continua a non fregargliene nulla...

  4. #4
    L'avatar di gibra
    gibra non è in linea Very Important Person

  5. #5
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da gibra Visualizza il messaggio
    e sostituire

    btnSalva_Click(Nothing, Nothing)

    con

    btnSalva.PerformClick()

    ?
    Così è perfetto!

    Ma continua a restarmi il dubbio del perché la chiamata alla routine Salva() funzioni dal click del btnSalva e non sugli altri... Che ci sia qualche evento del DataGridView che non interviene se non perde lo stato attivo e di conseguenza non modifica il DataSource? O sto solo complicando una situazione semplice?

  6. #6
    L'avatar di gibra
    gibra non è in linea Very Important Person
    Guarda, non è certo un problema esistenziale
    Non ho mai fatto test al riguardo, né ho mai approfondito tale questione, però la cosa che mi è saltata all'occhio sono stati quei Nothing, passati all'evento Click, e quindi il mio dubbio è stato scaturito 'spontaneamente':
    a) Se ci sono quei parametri, potrebbe essere che il sistema li richieda (ed il click, in effetti li valorizza automaticamente)
    b) se Microsoft ha previsto il metodo PerformClick(), ci sarà un motivo

    La deduzione è che probabilmente il metodo PerformClick() serva proprio ad evitare allo sviluppatore di dover passare dei parametri che, in certi casi, come questo, non avrebbero senso.

    Ma la mia deduzione potrebbe essere del tutto priva di fondamento.
    Ultima modifica di gibra; 24-06-2017 12:32 
    ℹ️ Leggi di più su gibra ...

  7. #7
    Dev-01 non è in linea Scribacchino
    Ciao Dev-01,

    ho seguito entrambi i tuoi suggerimenti e non ho cavato un ragno dal buco...
    Ti dirò:

    non so quale sia il problema ma quest'affermazione mi lascia alquanto perplesso.

    I metodi indicati risultano perfettamente riproducibili e validi.

    Considerate le difficoltà che stai trovando mi vengono in mente snervanti problematiche affrontate in passato e risolte esclusivamente tramite l'installazione di una versione successiva di Visual Studio; nel caso queste dovessero persistere o moltiplicarsi, ti consiglio vivamente di prendere in considerazione quest'ultima ipotesi o almeno una reinstallazione pulita (disintallando prima e pulendo il sistema con qualche tool apposito).

  8. #8
    Dev-01 non è in linea Scribacchino
    a) Se ci sono quei parametri, potrebbe essere che il sistema li richieda (ed il click, in effetti li valorizza automaticamente)
    b) se Microsoft ha previsto il metodo PerformClick(), ci sarà un motivo

    La deduzione è che probabilmente il metodo PerformClick() serva proprio ad evitare allo sviluppatore di dover passare dei parametri che, in certi casi, come questo, non avrebbero senso.

    Ma la mia deduzione potrebbe essere del tutto priva di fondamento.
    Non lo è.

    In realtà il metodo PerformClick() contiene all'incirca il seguente codice:

    Public Sub PerformClick()
    
    RaiseEvent Click(Me, New EventArgs)
    
    End Sub
    
    E giustamente evita la scrittura di codice specifico del cui utilizzo, è abbastanza facile ve ne sia bisogno.

    In generale il 'sender' serve ad identificare l'oggetto che scatena l'evento (da utilizzare per poter intraprendere specifiche azioni) e gli''EventArgs' spesso portano con se informazioni aggiuntive di una qualche utilità (per esempio 'e.KeyCode', tanto per dirne una).

    L'utilizzo di 'EventArgs' custom consente di gestire molto facilmente gli Handler di una collezione di controlli legati ad una routine comune (si pensi ad

    AddHandler Line.Click, AddressOf SetSelectedItem
    
    oppure

    AddHandler Line.Click, AddressOf TypeActions ' * L'evento Click è stato sovrascritto da una dichiarazione 'Shadows'.
    
    Sub TypeActions(Byval sender As Objects, Byval e As MyCustomEventArgs)
    
    Select Case e.Type
            ' * Codice
    End Select
    
    End Sub
    
    ) ad esempio, dove si voglia emulare (tanto per espletare) il comportamento di una listbox in un controllo personalizzato.

  9. #9
    Sgrubak non è in linea Scribacchino
    Quote Originariamente inviato da gibra Visualizza il messaggio
    Guarda, non è certo un problema esistenziale
    Non ho mai fatto test al riguardo, né ho mai approfondito tale questione, però la cosa che mi è saltata all'occhio sono stati quei Nothing, passati all'evento Click, e quindi il mio dubbio è stato scaturito 'spontaneamente':
    Ho tentato di passare vari parametri alla routine, compreso Me.btsSalva. Ma non ha mai sortito l'effetto sperato. In VBA non esiste il metodo PerformClick() ma si fa riferimento al codice del bottone, richiamando la routine come ho provato a fare. Ignoranza mia. Studierò ancora.

    Quote Originariamente inviato da Dev-01 Visualizza il messaggio
    Ti dirò:

    non so quale sia il problema ma quest'affermazione mi lascia alquanto perplesso.

    I metodi indicati risultano perfettamente riproducibili e validi.

    Considerate le difficoltà che stai trovando mi vengono in mente snervanti problematiche affrontate in passato e risolte esclusivamente tramite l'installazione di una versione successiva di Visual Studio; nel caso queste dovessero persistere o moltiplicarsi, ti consiglio vivamente di prendere in considerazione quest'ultima ipotesi o almeno una reinstallazione pulita (disintallando prima e pulendo il sistema con qualche tool apposito).
    Anche a me sembravano validi e nel momento in cui ho visto entrare il debug dentro la routine ho gioito assai, per poi capitolare nello sconforto alla vista del risultato. Ma cerco il lato positivo: ho coniato nuove imprecazioni.

  10. #10
    Dev-01 non è in linea Scribacchino
    Anche a me sembravano validi
    E lo sono.

    Non so cosa non ti funzioni, ma affermare che "ti sembravano" è una informazione deviata per chi leggerà successivamente.

    Detto questo, come ribadito da gibra, esiste un metodo apposito e il "non esistenziale" problema si risolve.

    Personalmente resto abbastanza curioso di capire il perché il mio codice non ti funzioni.

    Ma cerco il lato positivo: ho coniato nuove imprecazioni.
    Spero vivamente di non esserne parte.

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 3
    Ultimo Post: 05-12-2019, 17:18
  2. Risposte: 1
    Ultimo Post: 08-12-2016, 20:14
  3. Risposte: 4
    Ultimo Post: 25-10-2016, 13:12
  4. [VB2015] nascondere form all'uscita del mouse
    Da glak nel forum Visual Basic .Net
    Risposte: 16
    Ultimo Post: 20-04-2016, 19:29
  5. Risposte: 11
    Ultimo Post: 29-04-2014, 17:01