+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26

Ignorare un secondo click nella selezione di un combobox

  1. #1
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Buongiorno amici. Oggi vi propongo un problemino diverso dal solito.
    Un form mostra delle schede anagrafiche (cognome, nome e tante altre cose) mediante le TabPages di un TabControl. Al di sopra del TabControl c'è un ComboBox che serve per fare una ricerca per cognome, anche parziale. Se ad esempio si digita nel ComboBox "ROS" vengono elencati nel dropdown tutti i vari ROSSI, ROSSETTI, ROSATO ecc. ecc. (v. immagine).
    Se l'utente seleziona con un click (evento SelectedIndexChanged) uno dei cognomi elencati, la TabPage relativa diventa corrente e viene mostrata. Tutto OK.
    Il problema nasce se l'utente tenta di selezionare un cognome con doppio click: in questo caso, poiché la tendina aperta del combobox è parzialmente sovrapposta alle prime due tabpages, il secondo click viene intercettato dal tabcontrol e viene selezionata la tabpage che stava sotto.
    La domanda quindi è: come si può ignorare il secondo indesiderato click?
    Sto tendando con un Enabled=False del TabControl al primo click e Enabled=True dopo aver visualizzato la tabpage corretta, ma sembra che il secondo click rimanga comunque "in canna".
    Anche cercando di misurare il tempo tra i due click non ottengo un buon risultato.

    Vi viene in mente qualcosa di meglio?
    Grazie.
    Nome:   Fig2.JPG
Visite:  88
Grandezza:  50.1 KB
    ℹ️ Leggi di più su Brontolo ...

  2. #2
    Sgrubak non è in linea Scribacchino
    La butto li... Funziona ma non mi convince:
    Public Class Form1
        Dim disableTabChange As Boolean
        Dim Timer1 As New Timer()
        Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
            Timer1.Start()
            disableTabChange = True
        End Sub
        Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
            disableTabChange = False
            Timer1.Stop()
        End Sub
        Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
            e.Cancel = disableTabChange
        End Sub
    End Class
    
    Con Interval settato a 500, a funzionicchia bene...

  3. #3
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Ciao Sgrubak.
    La tua soluzione è funzionalmente equivalente a questa che avevo già sperimentato:
    Public Class Form1
        Dim firstClickTime as Double    
        ...
    
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        ...
        firstClickTime = DateAndTime.Timer
        ...
    End Sub
    
    Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
            If DateAndTime.Timer - firstClickTime < 1 Then   e.Cancel = True
    End Sub
    
    Anche questa "funzionicchia", nel senso che a volte sì, a volte no.
    Grazie comunque.
    ℹ️ Leggi di più su Brontolo ...

  4. #4
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Quote Originariamente inviato da Brontolo Visualizza il messaggio
    Anche questa "funzionicchia", nel senso che a volte sì, a volte no.
    Probabilmente, il tempo impostato (minore di un secondo) è troppo basso.
    ℹ️ Leggi di più su _alka_ ...

  5. #5
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Quote Originariamente inviato da _alka_ Visualizza il messaggio
    Probabilmente, il tempo impostato (minore di un secondo) è troppo basso.
    No, no. Il tempo di un doppio click è molto breve. Per verifica ho aggiunto una Label e questa riga.
    Label1.Text = DateAndTime.Timer - firstClickTime
    
    il valore indicato è dell'ordine di centesimi di secondo.
    Ho invece scoperto il motivo del funzionamento a corrente alternata: nell'evento TabControl1_Selecting ci sono altre linee di codice che, in alcuni casi, possono reimpostare e.Cancel = False.
    Quindi occorre un Exit Sub dopo e.Cancel = True
    Public Class Form1
        Dim firstClickTime as Double    
        ...
     
    Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
        ...
        firstClickTime = DateAndTime.Timer
        ...
    End Sub
     
    Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
            If DateAndTime.Timer - firstClickTime < 1 Then
                e.Cancel = True
                Exit Sub             '<-- Questa risolve
    End Sub
    
    C'è però un effetto collaterale.
    Il TabControl ha la proprietà DrawMode impostata a TabDrawMode.OwnerDrawFixed, perché intendo sfruttare l'evento DrawItem per evidenziare con un diverso colore il tab selezionato. Ecco, questa cosa non funziona più, l'evidenziazione rimane sullo stesso tab su cui era prima della nuova selezione.
    Mannaggia.
    ℹ️ Leggi di più su Brontolo ...

  6. #6
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Quote Originariamente inviato da Brontolo Visualizza il messaggio
    Ho invece scoperto il motivo del funzionamento a corrente alternata: nell'evento TabControl1_Selecting ci sono altre linee di codice che, in alcuni casi, possono reimpostare e.Cancel = False.
    Ah ok, purtroppo il codice riportato era privo delle altre istruzioni (direi giustamente, perché in genere si punta all'essenziale), quindi non era possibile determinarlo.

    Quote Originariamente inviato da Brontolo Visualizza il messaggio
    Il TabControl ha la proprietà DrawMode impostata a TabDrawMode.OwnerDrawFixed, perché intendo sfruttare l'evento DrawItem per evidenziare con un diverso colore il tab selezionato. Ecco, questa cosa non funziona più, l'evidenziazione rimane sullo stesso tab su cui era prima della nuova selezione.
    Forse qui converrebbe postare il codice, o uno screenshot, per capire meglio qual è l'effetto ottenuto e quale il desiderato.
    ℹ️ Leggi di più su _alka_ ...

  7. #7
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    L'effetto voluto è quello dell'immagine (BONACCHI evidenziato in blu) e che si ottiene con questo codice:
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
               ...
               TabControl1.DrawMode = TabDrawMode.OwnerDrawFixed
               ...
    
    
        Private Sub TabControl1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles tabGio.DrawItem
            HilightTab(TabControl1, e)
        End Sub
    
        
       Public Sub HilightTab(tc As TabControl, e As DrawItemEventArgs)
                Dim tp As TabPage = tc.TabPages(e.Index)
                Dim g As Graphics = e.Graphics
                Dim r As New RectangleF(e.Bounds.X, e.Bounds.Y + 2, e.Bounds.Width, e.Bounds.Height - 2)
                Dim f As Font = tc.Font
                Dim br As New SolidBrush(Color.Black)
                Dim sf As New StringFormat
    
                sf.Alignment = StringAlignment.Center
                If tc.SelectedIndex = e.Index Then
                    br.Color = Color.Blue
                    f = New Font(f, FontStyle.Bold)
                Else
                    br.Color = Color.Black
                    f = New Font(f, FontStyle.Regular)
                End If
                g.DrawString(tp.Text, f, br, r, sf)
    
                If tc.ImageList IsNot Nothing Then
                    Dim img As Image = tc.ImageList.Images(tp.ImageIndex)
                    g.DrawImage(img, e.Bounds.X + 4, e.Bounds.Y + 4)
                End If
        End Sub
    
    Funziona bene se si passa da una scheda all'altra cliccando normalmente sui tab, ma non se si seleziona un nominativo nella tendina del ComboBox.
    Nome:   Fig2.JPG
Visite:  57
Grandezza:  54.0 KB
    ℹ️ Leggi di più su Brontolo ...

  8. #8
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Postilla:
    e il motivo è che quando si verifica l'evento DrawItem il SelectedIndex del TabControl non è ancora stato aggiornato
    ℹ️ Leggi di più su Brontolo ...

  9. #9
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Quote Originariamente inviato da Brontolo Visualizza il messaggio
    Postilla:
    il motivo è che quando si verifica l'evento DrawItem il SelectedIndex del TabControl non è ancora stato aggiornato
    Potresti provare a intercettare l'evento SelectedIndexChanged, che si verifica quando l'indice del tab selezionato cambia definitivamente, e al suo interno chiamare il metodo Invalidate, che dovrebbe suggerire a Windows di ridisegnare il controllo ma, a quel punto, dovrebbe essere considerato il giusto tab scelto definitivamente all'interno della routine di "owner drawing".

    Ciao!
    ℹ️ Leggi di più su _alka_ ...

  10. #10
    Ecco un paio di riflessioni:
    1. Sposti il campo ricerca in un punto diverso, magari sotto la TabControl.
    2. Disabiliti la TabControl all'interno dell'evento "ComboBox.Enter" e la riabiliti solo dopo la pressione dell'apposito tasto di Ricerca, che vedo rappresentato nell'immagine, o alla pressione del tasto Enter.
    3. Inserisci un "DoEvents" subito prima dell'abilitazione del controllo TabControl, in questo modo, in linea teorica, permetti al sistema di generare il secondo Click PRIMA di abilitare il controllo, rimuovendo l'evento dalla coda.


    Puoi combinare più riflessioni insieme (anche tutte)
    ℹ️ Leggi di più su Fix ...

+ Rispondi al messaggio
Pagina 1 di 3 123 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 5
    Ultimo Post: 11-06-2017, 22:02
  2. Escludere secondo click del mouse
    Da camp nel forum Visual Basic 6
    Risposte: 13
    Ultimo Post: 03-01-2012, 19:58
  3. Aggiornare sottomaschera secondo valore ComboBox
    Da eldy71 nel forum Microsoft Access
    Risposte: 2
    Ultimo Post: 19-02-2011, 19:16
  4. Risposte: 2
    Ultimo Post: 21-03-2007, 23:59
  5. [VB6]selezione record con doppio click su un datagrid
    Da printlist nel forum Visual Basic 6
    Risposte: 5
    Ultimo Post: 06-02-2007, 23:06