Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347

    [VB.NET] Finestra a scorrimento combobox e autocomplete

    salve a tutti!
    ho l'esigenza di fare una combobox autocomplete.. ora per l'autocomplete nn c'è problema (+/-), guardando la documentazione di vb ho trovato come i signori microsoft affrontano l'autocomplete.. nn fosse che se uno scrive velocemente l'autocomplete da dei problemi.. scrive la prima parola che trova.. se qualcuno ha qualche consiglio su come risolvere il problema.. vi posto il codice:

    codice:
        Private Sub cmbTitoli_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles cmbTitoli.KeyUp
            Dim index As Integer
            Dim actual As String
            Dim found As String
            ' Do nothing for some keys such as navigation keys.
            If ((e.KeyCode = Keys.Back) Or _
                (e.KeyCode = Keys.Left) Or _
                (e.KeyCode = Keys.Right) Or _
                (e.KeyCode = Keys.Up) Or _
                (e.KeyCode = Keys.Delete) Or _
                (e.KeyCode = Keys.Down) Or _
                (e.KeyCode = Keys.PageUp) Or _
                (e.KeyCode = Keys.PageDown) Or _
                (e.KeyCode = Keys.Home) Or _
                (e.KeyCode = Keys.End)) Then
    
                Return
            End If
    
            ' Store the actual text that has been typed.
            actual = Me.cmbTitoli.Text
    
            ' Find the first match for the typed value.
            index = Me.cmbTitoli.FindString(actual)
    
            ' Get the text of the first match.
            If (index > -1) Then
                found = Me.cmbTitoli.Items(index).ToString()
    
                ' Select this item from the list.
                Me.cmbTitoli.SelectedIndex = index
    
                ' Select the portion of the text that was automatically
                ' added so that additional typing will replace it.
                Me.cmbTitoli.SelectionStart = actual.Length
                Me.cmbTitoli.SelectionLength = found.Length
            End If
    
        End Sub
    Per funzionare correttamente una persona deve scrivere pianissimo!

    l'altro problema è che vorrei che la finestra di scorrimento della combobox si aprisse mentre uno sta scrivendo.. questo problema l'avevo risolto in vb6 inviando un messaggio CB_SHOWDROPDOWN alla combobox con l'api send message..
    ora però in .net nn so come fare!

    Grazie mille!

  2. #2
    Il problema che hai può essere risolto usando invece una TextBox con AutoCompleteMode impostato su Suggest, dopo aver associato alla proprietà AutoCompleteCustomSource una lista di stringhe definita in fase di sviluppo oppure a run-time. Ricorda di porre AutoCompleteSource su Custom.

  3. #3
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347
    ciao! perfetto.. questa è la solzione ideale!!! c'è solo un problema...
    per popolare la textbox utilizzo un ciclo for..

    codice:
            For i = 0 To (Titoli.Dataset.Tables("Titoli").Rows.Count - 1)            
    Me.txtTitoli.AutoCompleteCustomSource.Add(Titoli.Dataset.Tables("Titoli").Rows(i)("Nome").ToString)
            Next
    questo però è un pò lento dato la mole di dati.. volevo sapere se mi son perso qualche classe del .net per popolare l'autocomplete!

    Grazie!

  4. #4
    Mhh... mi sa che questa è l'unica soluzione possibile... Puoi provare però ad usare la tecnica della Variable Enregistration: in pratica, crei una variabile temporanea di tipo DataTable e ci copi dentro il valore della tabella corrispondente. Dato che viene dichiarata come interna a una procedura, il suo valore viene memorizzato in aree di memoria temporanee a più alta accessibilità, in modo da velocizzare leggermente il processo. In seconda istanza, prova ad usare un ciclo iterativo per oggetti e non per indici: in questo modo, ottieni direttamente l'istanza della riga senza doverla prelvare con l'indice ad ogni ciclo.
    codice:
    Dim Table As DataTable = Titoli.Dataset.Tables("Titoli").Clone
    
    For Each Row As DataRow In Table.Rows
      txtTitoli.AutoCompleteCustomSource.Add(Row("Nome").ToString)
    Next
    Viene anche più leggibile, ma ricorda che in questo modo la velocità viene sì aumentata (e non di molto), ma ne risente l'uso della memoria, poichè copi un dato assai vasto. Decidi tu come fare in base alle tue esigenze.

  5. #5
    Utente di HTML.it L'avatar di Fado84
    Registrato dal
    Feb 2004
    Messaggi
    347
    Grazie mille! il ciclo si è sesibilmente velocizzato! grazie ancora per la risposta tempestiva, molto dettagliata e chiara!
    ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.