Questo sito utilizza cookie tecnici e di terze parti. Continuando la navigazione sul nostro sito accetti l'uso dei cookie. Per saperne di più leggi l'informativa sui cookie.   


DataGridView e SuppressKeyPres
Ultimo messaggio: 12 dic 2018 13:33 di angelog. 14 Risposte.
Stampa gradevole
Solo gli utenti registrati possono rispondere ad una discussione.
Avatar
MarcoRossi
Messaggi: 373
Iscritto dal: 30 apr 2012 09:35
Utente
Utente

04 dic 2018 20:32

Buonasera

Sto cercando di utilizzare il controllo datagridview  come segue:

Grid2 viene caricata da database (lista di articoli)

 

 

rriga = Grid1.RowCount
        Grid1.Rows.Add()
        '    riga = Grid1.RowCountdim
        '  riga +=
        FlagRientro = "1"
        Grid1.Rows(riga - 1).Cells(0).Value = Grid2.Rows(riga_selezionata).Cells(0).Value
        Grid1.Rows(riga - 1).Cells(1).Value = Grid2.Rows(riga_selezionata).Cells(1).Value
        Grid1.Rows(riga - 1).Cells(4).Value = Grid2.Rows(riga_selezionata).Cells(2).Value
        Grid1.Rows(riga - 1).Cells(2).Value = Grid2.Rows(riga_selezionata).Cells(3).Value
        Grid1.Rows(riga - 1).Cells(7).Value = Grid2.Rows(riga_selezionata).Cells(6).Value
        Grid1.Rows(riga - 1).Cells(10).Value = Grid2.Rows(riga_selezionata).Cells(9).Value
        Grid1.CurrentCell = Grid1.Item(3, riga - 1)
        Grid1.Select()
        riga += 1

Tramite grid2 devo inserire qta , iva , sconti, prezzo   perciò devo spostarmi a livello cell .

Il problema che riscontro é che il cursore si posiziona sulla riga successiva.

Utilizzando SuppressKeyPres   dovrei risolvere i problema :

SuppressKeyPres  l'ho messo in keydown  pero non funziona il cursore sul tasto invio

si posiziona sulla riga successiva  al secondo invio esegue keydown 

 Private Sub Grid1_KeyDown(sender As Object, e As KeyEventArgs) Handles Grid1.KeyDown

        If e.KeyCode = Keys.[Return] Then
            If Grid1.CurrentCell.ColumnIndex = Grid1.ColumnCount - 1 Then
                Grid1.CurrentCell = Grid1(0, Grid1.CurrentCell.RowIndex + 1)
            Else
                Grid1.CurrentCell = Grid1(Grid1.CurrentCell.ColumnIndex + 1, Grid1.CurrentCell.RowIndex)
                ' Rriga = Grid1(0, Grid1.CurrentCell.RowIndex)
                ' e.CurrentRow

            End If
            e.SuppressKeyPress = True
           
        End If

Questa soluzione non e corretta perché solo dopo il secondo invio il  suppresskeypress e attivo   

come posso risolvere 

Grazie 

 

    Avatar
    orione1976
    Messaggi: 100
    Iscritto dal: 11 ott 2017 10:08
    Utente
    Utente

    04 dic 2018 21:38

    ciao non so se ho capito bene ma io una cosa così l'ho risolta in questo modo.

    metti delle textbox con i campi che vuoi inserire nel datagredview ed un bottone per salvare, metti il codice nel bottone e visualizzi nel DGV poi quando selezioni la riga di tuo interesse la fai ricaricare nelle textbox, fai quello che devi e poi con il pulsante di prima, salvi i dati, così puoi fare come ti pare sia con il il posizionamento che il resto, a me non piace scrivere direttamente nel dvg, anche per eliminare righe per esempio aggiungo un pulsante elimina con tutti i vari messaggi di conferma.

     

    E' un idea, vedi se ti rimane utile

     

    Marco

     

      Avatar
      MarcoRossi
      Messaggi: 373
      Iscritto dal: 30 apr 2012 09:35
      Utente
      Utente

      05 dic 2018 07:59

      BuonGiorno Orione 

      Grazie della risposta .

      La tua soluzione é un complicata (Se puoi postare alcune righe di codice)  il datagridview deve inserire le righe per la creazione di un documento (Fattura Bolle Ordini….) 

        Avatar
        orione1976
        Messaggi: 100
        Iscritto dal: 11 ott 2017 10:08
        Utente
        Utente

        06 dic 2018 21:53

        Ciao Marco, il mio è un suggerimento, io per esempio mi trovo bene così ma non è detto sia la soluzione migliore.... allora, tieni presente che nel form ho un datagridview e le textbox che vado a usare in più i bottoni aggiungi o rimuovi (la riga selezionata) e poi il tasto modifica

         

        Per aggiungere compilo le textbox poi faccio come segue:

        Private Sub BTNAggiungi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNAggiungi.Click
                If TBCognome.Text = "" Or TBNome.Text = "" Or TBScadenza.Text = "" Then
                    MsgBox("ATTENZIONE i campi Cognome, Nome e Scadenza sono obbligatori", MsgBoxStyle.OkOnly, "ATTENZIONE")
                    BTNModifica.Enabled = False
                Else
                    For Each riga As DataGridViewRow In DataGridView1.Rows
                        If String.IsNullOrEmpty(riga.Cells(0).Value) = False And String.IsNullOrEmpty(riga.Cells(1).Value) = False Then
                            Dim stringa1 As String = riga.Cells(0).Value.ToString
                            Dim stringa2 As String = riga.Cells(1).Value.ToString
                            If stringa1.IndexOf(TBCognome.Text) = 0 And stringa2.IndexOf(TBNome.Text) = 0 Then
                                MsgBox("Atleta Già Presente Nel DataBase", MsgBoxStyle.Exclamation)
                                Exit Sub
                            End If
                        End If
                    Next
                    Me.DataGridView1.Rows.Add(TBCognome.Text, TBNome.Text, TBResidenza.Text, TBTelefono.Text, TBMail.Text, TBDisciplina.Text, TBScadenza.Text, TBNote.Text, TBTessera.Text, LBLsigla.Text)

         

        OVVIAMENTE i nomi li cambi

          Avatar
          orione1976
          Messaggi: 100
          Iscritto dal: 11 ott 2017 10:08
          Utente
          Utente

          06 dic 2018 21:55

          Questo lo uso per modificare, quindi quando clicco sulla cella mi carica i dati nelle relative textbox modifico quello che devo e poi vado sul pulsante MODIFICA

           

          Private Sub BTNModifica_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNModifica.Click
                  If TBCognome.Text = "" Or TBNome.Text = "" Or TBScadenza.Text = "" Then
                      MsgBox("ATTENZIONE i campi Cognome, Nome e Scadenza, sono obbligatori", MsgBoxStyle.OkOnly, "ATTENZIONE")
                  Else
                      Dim modifica As Integer = DataGridView1.CurrentRow.Index
                      Me.DataGridView1.Item(0, modifica).Value = TBCognome.Text
                      Me.DataGridView1.Item(1, modifica).Value = TBNome.Text
                      Me.DataGridView1.Item(2, modifica).Value = TBResidenza.Text
                      Me.DataGridView1.Item(3, modifica).Value = TBTelefono.Text
                      Me.DataGridView1.Item(4, modifica).Value = TBMail.Text
                      Me.DataGridView1.Item(5, modifica).Value = TBDisciplina.Text
                      Me.DataGridView1.Item(6, modifica).Value = TBScadenza.Text
                      Me.DataGridView1.Item(7, modifica).Value = TBNote.Text
                      Me.DataGridView1.Item(8, modifica).Value = TBTessera.Text
                      Me.DataGridView1.Item(9, modifica).Value = LBLsigla.Text

            Avatar
            orione1976
            Messaggi: 100
            Iscritto dal: 11 ott 2017 10:08
            Utente
            Utente

            06 dic 2018 21:56

            Nel pulsante Rimuovi metto questo

             

             Dim Risposta As MsgBoxResult
                    Risposta = MsgBox("Rimuovere L'atleta Selezionato?", MsgBoxStyle.OkCancel, "Rimuovi Atleta")
                    If Risposta = MsgBoxResult.Ok Then
                        DataGridView1.Rows.Remove(DataGridView1.CurrentRow)

             

            così elimina solo la riga selezionata

             

            Ovviamente nel datagridviwe ho impedito lettura scrittura aggiunte etc... altrimenti questo sistema è inutile

              Avatar
              orione1976
              Messaggi: 100
              Iscritto dal: 11 ott 2017 10:08
              Utente
              Utente

              06 dic 2018 22:03

              e questo nell'evento cellclick del dgv

               

              Private Sub DataGridView1_CellClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick
                      On Error Resume Next
                      TBCognome.Text = DataGridView1.Rows(e.RowIndex).Cells(0).Value
                      TBNome.Text = DataGridView1.Rows(e.RowIndex).Cells(1).Value
                      TBResidenza.Text = DataGridView1.Rows(e.RowIndex).Cells(2).Value
                      TBTelefono.Text = DataGridView1.Rows(e.RowIndex).Cells(3).Value
                      TBMail.Text = DataGridView1.Rows(e.RowIndex).Cells(4).Value
                      TBDisciplina.Text = DataGridView1.Rows(e.RowIndex).Cells(5).Value
                      TBScadenza.Text = DataGridView1.Rows(e.RowIndex).Cells(6).Value
                      TBNote.Text = DataGridView1.Rows(e.RowIndex).Cells(7).Value
                      TBTessera.Text = DataGridView1.Rows(e.RowIndex).Cells(8).Value
                      BTNAggiungi.Enabled = False
                      BTNModifica.Enabled = True
                  End Sub

               

              Ovviamente in questi esempi metterai le tue variabili i tuoi messaggi farai i tuoi controlli incrociati e dovrai stabilire dove salvare i dati e come ricaricarli, io lo faccio su un file che creo e salvo in un percorso specifico, la cosa migliore è usare un database vero e proprio ma questo dipende dall'uso che devi farne, per quanto serve a me è piu che sufficiente.

               

              CI TENGO A PRECISARE CHE MOLTO DI QUESTO LAVORO è FRUTTO DI SUGGERIMENTI DEGLI AMICI DI QUESTO FORUM Quindi magari se cerchi trovi anche i post e tutte le spiegazioni che sono veramente la cosa piu importante... spero ti sia utile e spero tu abbia il tempo di andare a vedere il perchè di questi codici... Ringrazio ancora tutti quelli che mi hanno aiutato a comprendere e buon lavoro

               

                Avatar
                MarcoRossi
                Messaggi: 373
                Iscritto dal: 30 apr 2012 09:35
                Utente
                Utente

                07 dic 2018 09:54

                Buongiorno

                Ti ringrazio  degli esempi  che mi hai inviato però non ritengo la soluzione valida per le mie esigenze.  

                Il problema da risolvere nella soluzione che vorrei é la possibilità di muovermi in datagridview

                tramite il tasto invio per l'introduzione dei dati .  

                Attualmente con il mio codice  alla pressione del stato enter  su una certa riga il cursore  si sposta sul record successivo e riportando sulla riga precedente inizia a funzionare correttamente.
                Devo quindi gestire uno degli eventi keydown,
                SuppressKeyPress  in modo diverso da mio codice. 

                 

                  Avatar
                  Giorgio Brausi
                  Messaggi: 5865
                  Iscritto dal: 30 apr 2012 00:52
                  Utente
                  Utente

                  07 dic 2018 11:23
                  Prova così :

                   

                  Private Sub dgv_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgv.KeyDown
                       If e.KeyCode = Keys.Enter Then
                          e.Handled = True
                          ' TUO codice da eseguire
                      End If
                  End Sub

                   


                    Giorgio Brausi (aka gibra)
                    VB.NET-OleDB2008: Command and Parameters in ADO.NET
                    Office Automation in NET: VS2010 - Early-Late Binding: con Excel - con Word
                    VB6: Command and Parameters in ADODB
                    Office Automation in VB6: Early-Late Binding: con Excel - con Outlook
                    VS/VB 6.0 Installer wizard v5.0 29/10/2017: install VS6/VB6 (Ent/Pro) on Windows 2000/XP/Vista/7/8/10 (32/64 bit)
                    See YouTube video
                    Avatar
                    orione1976
                    Messaggi: 100
                    Iscritto dal: 11 ott 2017 10:08
                    Utente
                    Utente

                    08 dic 2018 10:10
                    Inviato da MarcoRossi su 07 dic 2018 09:54

                    Buongiorno

                    Ti ringrazio  degli esempi  che mi hai inviato però non ritengo la soluzione valida per le mie esigenze.  

                    Il problema da risolvere nella soluzione che vorrei é la possibilità di muovermi in datagridview

                    tramite il tasto invio per l'introduzione dei dati .  

                    Attualmente con il mio codice  alla pressione del stato enter  su una certa riga il cursore  si sposta sul record successivo e riportando sulla riga precedente inizia a funzionare correttamente.
                    Devo quindi gestire uno degli eventi keydown,
                    SuppressKeyPress  in modo diverso da mio codice. 

                     

                    Perfetto, avevo solo allegato qualche esempio come da te richiesto, ovvio poi dipende sempre da cosa devi fare non tutte le soluzioni sono adatte a tutti i problemi. Allora buon proseguimento nella ricerca della soluziona a te piu congeniale.

                    Marco


                      Avatar
                      GianniA
                      Messaggi: 3147
                      Iscritto dal: 30 apr 2012 01:14
                      Socio
                      Socio

                      08 dic 2018 11:52
                      Tempo fa mi sono imbattuto in un problrma analogo e ho scoperto che la gestione del tasto enter dall'interno di una cella (quando cioè sei in editing) è un casino. Io avevo risolto sfruttando gli eventi CellEndEdit e simili (mi pare. E' passato troppo tempo)

                        Avatar
                        MarcoRossi
                        Messaggi: 373
                        Iscritto dal: 30 apr 2012 09:35
                        Utente
                        Utente

                        09 dic 2018 13:32

                        Buongiorno Giorgio Brausi

                        Ho inserito il tuo suggerimento ma non funziona 

                          Private Sub Grid1_KeyDown(sender As Object, e As KeyEventArgs) Handles Grid1.KeyDown

                        If e.KeyCode = Keys.Enter Then
                                    If Grid1.CurrentCell.ColumnIndex = Grid1.ColumnCount - 4 Then
                                        Grid1.Rows.Add()
                                        Grid1.CurrentCell = Grid1(0, Grid1.CurrentCell.RowIndex + 1)
                                        If Grid1.RowCount Then
                                        End If
                                    Else
                                        Grid1.CurrentCell = Grid1(Grid1.CurrentCell.ColumnIndex + 1, Grid1.CurrentCell.RowIndex)
                                                 End If
                                    e.Handled = True
                                    e.SuppressKeyPress = True
                                    If Grid1.Rows(Grid1.CurrentCell.RowIndex).Cells(3).Value > 0 Then
                                        Calcola_Righe()

                                    End If
                                End If

                          Avatar
                          Giorgio Brausi
                          Messaggi: 5865
                          Iscritto dal: 30 apr 2012 00:52
                          Utente
                          Utente

                          09 dic 2018 17:20
                          Non importa, non tenevo conto che sei in editing quindi probabilmente è come ha scritto Gianni.
                          A me funziona, ma non sono in editing.

                          Non potendolo testare (non uso e non userò mai l'editing in griglia) non tener conto del mio suggerimento.

                          Anche se, era ovvio che caso mai funzionasse, l'istruzione Handled = True andava usata PRIMA del TUO codice. Messa DOPO non conto proprio niente.

                          Ciao.


                            Giorgio Brausi (aka gibra)
                            VB.NET-OleDB2008: Command and Parameters in ADO.NET
                            Office Automation in NET: VS2010 - Early-Late Binding: con Excel - con Word
                            VB6: Command and Parameters in ADODB
                            Office Automation in VB6: Early-Late Binding: con Excel - con Outlook
                            VS/VB 6.0 Installer wizard v5.0 29/10/2017: install VS6/VB6 (Ent/Pro) on Windows 2000/XP/Vista/7/8/10 (32/64 bit)
                            See YouTube video
                            Avatar
                            Stefano-3Soft
                            Messaggi: 478
                            Iscritto dal: 30 apr 2012 11:31
                            Socio
                            Socio

                            10 dic 2018 09:58

                            ciao Marco. Sto proprio ora gestendo una situazione credo simile alla tua. Il mio problema è quello di intercettare in una cell (in editing) tutti i tasti diversi da numeri (la cella deve permettere solo l'inserimento o la modifica di valori interi) e la sto risolvendo così:

                            Nella parte dichiarativa

                            Private dgvTextBox as TextBox

                            nel codice:

                            Private Sub dgvUMQty_EditingControlShowing(ByVal sender As Object, _

                                                                       ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _
                                        
                            Handles dgvUMQty.EditingControlShowing
                                
                            Dim dgv As DataGridView = DirectCast(sender, DataGridView)
                                
                            If dgv.CurrentCell.ColumnIndex = colUMQty.Index Then
                                    dgvTextBox = TryCast(e.Control, TextBox)         If dgvTextBox IsNot Nothing Then
                                        RemoveHandler dgvTextBox.KeyPress, AddressOf dgvTextBoxEdit_KeyPress
                                        
                            AddHandler dgvTextBox.KeyPress, AddressOf dgvTextBoxEdit_KeyPress
                                    
                            End If
                                End If
                            End
                             Sub

                            Questo evento si scatena al momento dell'editing della cella e aggiunge un gestore dell'evento KeyPress:

                            Private Sub dgvTextBoxEdit_KeyPress(ByVal sender As ObjectByVal e As System.Windows.Forms.KeyPressEventArgs)

                                If e.KeyChar = Convert.ToChar(Keys.Back) Then
                                    e.Handled = False
                                Else
                                    If Not Char.IsDigit(e.KeyChar) Then
                                        e.Handled = True
                                    Else
                                        e.Handled = False
                                    End If
                                End If
                            End
                             Sub

                            Infine per evitare che tutte le altre celle vengano interessate da questa procedura (non tutte le celle aspettano solo valori interi) nel Validate della cella rimuovo il gestore dell'evento:

                            Private Sub dgvUMQty_CellValidated(ByVal sender As ObjectByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvUMQty.CellValidated

                                Dim dgv As DataGridView = DirectCast(sender, DataGridView)
                                
                            If dgvTextBox IsNot Nothing Then
                                    RemoveHandler dgvTextBox.KeyPress, AddressOf dgvTextBoxEdit_KeyPress
                                    dgvTextBox = 
                            Nothing
                                End If
                            End
                             Sub

                            Spero possa esserti utile. Se hai dubbi o domande fammi sapere.

                            Stefano

                             

                              Avatar
                              angelog
                              Messaggi: 3
                              Iscritto dal: 30 apr 2012 11:05
                              Utente
                              Utente

                              12 dic 2018 13:33

                              Se ho capito la tua esigenza è quella di sostituire il tasto Enter con il tasto TAB nella DatagridView.

                              Se così è, ti posto la seguente classe di DGV che andrà a sostituire la DGV di sistema:

                              Public Class MyDatagridview

                              Inherits Datagridview

                              Protected Oveloads Ovverrides Fuction ProcessDialogKeys(byval keyData as Keys) as Boolean

                              if keyData=Keys.Enter then

                              MyBase.ProcessTabKey(keys.Tab)

                              Return True

                              End if

                              Return myBase.ProcessDialogkey(keyData)

                              End Function

                              Protected Overloads Overrides Function ProcessDataGridViewKey(byval e as KeyEventArgs) as Boolean

                              If e.Keycode=keys.Enter then

                              MyBase.ProcessTabKey(Keys.Tab)

                              Return true

                              End if

                              Return Mybase.ProcessDataGridViewKey(e)

                              End function

                              End Class

                              Saluti

                                Solo gli utenti registrati possono rispondere ad una discussione.