ComboBox in AutoCompleteMode.Suggest insieme alla lista DropDown brutt...

mercoledì 10 aprile 2013 - 16.19
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows 7  |  Visual Studio 2010

joeputrisino Profilo | Junior Member

Salve a tutti. Ho un problema con la combobox. Per il suo funzionamento un pochettino anomalo.
Spiego quello che ho fatto e cosa mi succede. Riempo i valori della combo tramite un DataRow e ho settato la proprietà AutoCompleteMode in "AutoCompleteMode.Suggest" ed impostato la sua DropDownStyle in "DropDown" così da consentire all'utente di digitare le lettere. Funziona tutto perfettamente, solo che se viene cliccato il pulsante della combo ed il menù della lista compare ma allo stesso tempo si digita compare anche il menù dalla funzione "Suggest". Vorrei sapere se all'attivazione del menù in modalità "Suggest" è possibile chiudere il menù della lista DropDown. Spero di essere stato chiaro e attendo fiducioso le vostre risposte. Grazie.
Maurizio Maccarrone
New Phonia Ltd

Vinsent Profilo | Senior Member

Brutta notizia, avevo in mente di fare la stessa cosa!
Dopo ci guardo e ti faccio sapere.

joeputrisino Profilo | Junior Member

Grazie, fammi sapere...ci ho sbattuto un pochetto ma nulla. Diciamo che sto pensando di togliere la possibilità di cliccare sulla combo e lasciare solo la funzione Append. Anche se penso si possa risolvere questa situazione antipatica. Ciao

P.S.
Dopo tante ricerche a quanto ho capito le due cose non posso coesistere assime...o meglio potrebbero ma bisogna dire quale delle due è la sorgente per i dati. Ho trovato un codice di esempio con tutte le spiegazioni a questo indirizzo...Per il momento era come sospettavo o uno o l'altro. Ti do l'indirizzo se ti può essere utile:

http://www.dotnetheaven.com/article/combobox-with-autocomplete-textbox-in-vb.net

Ciao

Maurizio Maccarrone
New Phonia Ltd

Vinsent Profilo | Senior Member

Dopo millemila prove con le cose più "esotiche" che conoscono mi è caduto l' occhio su DroppedDown....di una semplicità MOSTRUOSA in confronto alle seghe mentali che mi ero fatto!

Dim CBitems As New ArrayList Private Sub Form1_Load() Handles MyBase.Load CBitems.Add("") CBitems.Add("pippo") CBitems.Add("pippa...") CBitems.Add("orazio") CBitems.Add("clarabella") CBitems.Add("paperone") CBitems.Add("qui") CBitems.Add("quo") CBitems.Add("qua") CBitems.Add("paperino") CBitems.Add("paperina") CBitems.Add("topolino") CBitems.Add("topolina") CBitems.Add("eta beta") CBitems.Add("archimede") ComboBox1.Items.AddRange(CBitems.ToArray) ComboBox1.DropDownStyle = ComboBoxStyle.DropDown ComboBox1.AutoCompleteMode = AutoCompleteMode.Suggest ComboBox1.AutoCompleteSource = AutoCompleteSource.ListItems End Sub 'alla pressione di un tasto si chiude la DropDown List 'e compare la AutoComplete List Private Sub ComboBox1_KeyDown() Handles ComboBox1.KeyDown ComboBox1.DroppedDown = False End Sub

joeputrisino Profilo | Junior Member

Ti ringrazio per la soluzione. Tutto perfetto era quello che volevo...Così possono coesistere entrambi. Ritorno ad amare l'oggettino combo. L'unica critica se proprio vogliamo essere precisi, è il fatto che all'evento keydown, se il dropdown è attivo e si vuole entrare con le frecce della tastiera nella lista, ovviamente la lista si chiude....ma l'utente ha pure sempre un mouse nelle mani! Resta il fatto che si può continuare ad utilizzare l'altra tendina quella del suggest. Ho già aggiunto il codice e ti ringrazio per le tue "seghe" mentali....Era semplice trovare il modo di chiudere la lista....Ma quando ci si sbatte certe volte quelle semplici non vengono mai in mente. A buon rendere.
Maurizio Maccarrone
New Phonia Ltd

Vinsent Profilo | Senior Member

>L'unica critica se proprio vogliamo essere precisi, è
>il fatto che all'evento keydown, se il dropdown è attivo e si
>vuole entrare con le frecce della tastiera nella lista, ovviamente
>la lista si chiude....ma l'utente ha pure sempre un mouse nelle
>mani!
Fatto....io però devo evitare l' inserimento di alcuni caratteri secondo delle condizioni e verificare il testo inserito. Quando un controllo ha "troppo codice" preferisco creare un custom control, ho tolto un pò di "roba" e lasciato il necessario...
La ComboBox custom:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Per aggiungere le frecce al controllo:
Private Sub Form1_Load() Handles MyBase.Load CBcustom1.TastoAdd(Keys.Up) CBcustom1.TastoAdd(Keys.Down) End Sub
In pratica la ComboBox si comporta come nel primo esempio tranne per il discorso che hai citato, basta aggiungere il Tasto e questo non chiude la DropDownList.
Se si digita compare la Suggest e si chiude la DropDownList, se si cancella tutto(Me.Text = "") ricompare la DropDownList.
Vedi tu se può servirti...se hai bisogno spiegazioni chiedi pure.
Ciao!

joeputrisino Profilo | Junior Member

Grazie 1000! Non sai quanto sei stato utile. Mi hai anche ricordato ed illuminato sugli oggetti che possono essere modificati e quindi personalizzati.
Già andava bene la combo come era stata suggerita da te.
Adesso è il non plus ultra della combobox del mio progetto.
Mi hai dato l'idea per personalizzare l'oggetto datagridview che uso.
Grazie ancora.

P.S.
Scusa se ti disturbo ancora, ma secondo te è possibile dare alla combo la proprietà "AlternatingRowsDefaultCellStyle" che esiste nel datagridview? In modo da visualizzare i dati della lista con colore alternato? Sto diventando pesante lo so


Maurizio Maccarrone
New Phonia Ltd

Vinsent Profilo | Senior Member

Non mi piace tanto cosa è venuto fuori, quando si chiude il form si apre la DropDown, non ho capito completamente ciò che ho scritto...inoltre devo capire come fare l' Overrides della Sub sotto.
Comunque, sono partito da questo:
http://msdn.microsoft.com/it-it/library/system.windows.forms.combobox.drawitem.aspx
Imposta la proprietà DrawMode come scritto nel link oppure nella "Sub New" del custom control aggiungi:
Me.DrawMode = DrawMode.OwnerDrawVariable
Poi aggiungi:
Private Sub CBcustom_DrawItem(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DrawItemEventArgs) _ Handles Me.DrawItem Dim coloreSfondo As Color Dim coloreCarattere As System.Drawing.Brush Dim myFont As System.Drawing.Font 'e.state indica se il mouse è sopra una riga If e.State = 1 Then coloreSfondo = Color.DarkCyan coloreCarattere = Brushes.White Else coloreCarattere = Brushes.Black 'prima riga bianca If e.Index = 0 Then coloreSfondo = Color.White Else 'distinzione tra righe pari o dispari If ((e.Index Mod 2) <> 0) Then coloreSfondo = Color.WhiteSmoke Else coloreSfondo = Color.Gainsboro End If End If End If e.DrawBackground() Dim rectangle As Rectangle = New Rectangle(e.Bounds.Left, _ e.Bounds.Top, e.Bounds.Width, e.Bounds.Height) e.Graphics.FillRectangle(New SolidBrush(coloreSfondo), rectangle) myFont = New Font(Me.Font.FontFamily, Me.Font.Size, FontStyle.Regular) e.Graphics.DrawString(Me.Items(e.Index), myFont, coloreCarattere, _ New RectangleF(e.Bounds.X, e.Bounds.Y, _ e.Bounds.Width, e.Bounds.Height)) e.DrawFocusRectangle() End Sub
E' solo un' abbozzo ma penso che la sostanza ci sia...

joeputrisino Profilo | Junior Member

Grazie del tuo interessamento come sempre. Per quanto riguarda la combo con entrambi i menù di cui abbiamo parlato all'inizio del post, ho deciso alla fine di tenermi la combobox del Visual Studio 2012 ed implementare solo l'evento KeyDwon.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Per l' alternanza del colore in base al suo contenuto, ho letto sia il link che tra l'altro avevo già trovato ed il tuo codice. Oggi pomeriggio dovrei essere libero e ci sbatto un pochetto. Vediamo se stavolta posso renderti il favore.

P.S.
Ho cominciato adesso e sembra funzionare, solo che si perde il rettangolo blu con carattere bianco di quando sali e scendi con le frecce sulla lista in dropdwon e quando clicchi con il mouse...Ci sbatto un pochetto

Maurizio Maccarrone
New Phonia Ltd

Maurizio Maccarrone
New Phonia Ltd

joeputrisino Profilo | Junior Member

Sono arrivato a questa conclusione per adesso. Dove riempo la combobox con una DataRow, imposto
Me.ComboBoxCasacata.DrawMode = DrawMode.OwnerDrawVariable

Dopo nel disegno ho fatto un mix tra il tuo codice e quello del link:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Adesso ho il rettangolino di selezione quando vado sopra con il mouse oppure scorro con le frecce della tastiera. Ottimo grazie del tuo aiuto...Ma siccome devo lasciarti sempre con qualche compito. Per adesso il disegno alternato compare solo prima delle scritte interne alla mia combo. Ovvero un rettangolino alternato. Già mi va bene, volevo solo coloare tutto anche le scritte...Ho provato a giocare sul punto :
e.Graphics.DrawString(Me.ComboBoxCasacata.Items(e.Index), myFont, coloreCarattere, _
New RectangleF(e.Bounds.X + rectangle.Width, e.Bounds.Y, _
e.Bounds.Width, e.Bounds.Height))
ma ancora non ho risolto molto. Ti faccio sapere se risolvo in caso.
Maurizio Maccarrone
New Phonia Ltd

Vinsent Profilo | Senior Member

Con i "quadratini" ci ero cascato anch'io...devi tenere buoni gli "e.bounds" del mio post precedente, cioè senza fare somme e quant' altro.
Occhio che se fai lo sfondo nero e il carattere nero....e il primo "e.DrawBackground()" credo non serva.
Comunque basta che copi/incolli la sub del mio post precedente e cambi i colori/font a tuo piacimento.
Ciao

joeputrisino Profilo | Junior Member

Ok farò come tuo consiglio. Mi pare che avevo già provato questo ma il colore sovrascriveva pure le scritte. Cmq i quadratini non sono male!

>e il primo "e.DrawBackground()" credo non serva.

Hai ragione ma come avrai capito avevo fatto copia incolla prima del tuo codice e poi quello del link e commentavo le vare forme mentre provavo....

Ti faccio sapere se mi sovrascrive le scritte. Ciao e grazie

P.S.
Ho giocato come mi hai consigliato e ha colorato tutto e la scitta resta perfettamente. Solo che perdo il rettangolo del mouse quando si focalizza sulle varie scritte contenute nel mio datarow in dropdown. Invece con il quadratino mantengo l'effetto del mouse ed a mio avviso è più bello. Tutto per farti capire che ho apprezzato molto il tuo aiuto e penso che il post sia definitivamente chiuso con tutto quello che c'era da sapere per la combobox...almeno per quanto mi riguarda. Ciao e grazie ancora.

Maurizio Maccarrone
New Phonia Ltd

Vinsent Profilo | Senior Member

>P.S.
>Ho giocato come mi hai consigliato e ha colorato tutto e la scitta
>resta perfettamente. Solo che perdo il rettangolo del mouse quando
>si focalizza sulle varie scritte contenute nel mio datarow in
>dropdown.
Questo lo avevo risolto con questa IF:
'e.state indica se il mouse è sopra una riga If e.State = 1 Then coloreSfondo = Color.DarkCyan coloreCarattere = Brushes.White
in pratica la Sub si avvia ogni volta che la dropdownlist viene disegnata e questo comprende ogni singolo elemento, compreso il passaggio del mouse. Quindi, credo che si può togliere "e.DrawFocusRectangle()" che si occupa appunto di evidenziare la riga visto che lo faccio già con l' IF...non posso provare per colpa di Avast...

>Invece con il quadratino mantengo l'effetto del mouse
>ed a mio avviso è più bello.
Va a gusti e a quel che serve realizzare , io sto sperimentando cerchi, poligoni vari e immagini!
Si possono usare tutti i metodi di "e.Graphics" per inserire grafica e testo, basta azzeccare le "misure"...Avast permettendo....

>Tutto per farti capire che ho apprezzato
>molto il tuo aiuto e penso che il post sia definitivamente chiuso
>con tutto quello che c'era da sapere per la combobox...almeno
>per quanto mi riguarda. Ciao e grazie ancora.
>
>Maurizio Maccarrone
>New Phonia Ltd
Di niente! Con l' occasione ho imparato parecchie cose!

Avast: continua a trovare un fantomatico virus ogni "una si e una no" sul progetto...du palle!

joeputrisino Profilo | Junior Member

>Questo lo avevo risolto con questa IF:

>'e.state indica se il mouse è sopra una riga If e.State = 1 Then coloreSfondo = Color.DarkCyan >coloreCarattere = Brushes.White

>in pratica la Sub si avvia ogni volta che la dropdownlist viene disegnata e questo comprende ogni singolo >elemento, compreso il passaggio del mouse. Quindi, credo che si può togliere "e.DrawFocusRectangle()" >che si occupa appunto di evidenziare la riga visto che lo faccio già con l' IF...non posso provare per colpa di >Avast...

Avevo mantenuto la tua IF che tra l'altro aveva il commento dove spiegava la sua funzione.
Ma lo stesso se decido di colorare tutta la scritta scompare il rettangolino quando scorri con il mouse. Cmq ho deciso di tenermi il rettangolino! ;)

Fammi sapere se anche a te fa lo stesso.

P.S.
Ho anche io Avast la versione free e non mi blocca mai nulla. Ciao
Maurizio Maccarrone
New Phonia Ltd

Vinsent Profilo | Senior Member

Scusa il ritardo...non so, forse è un problema di colori.
Nel codice sotto credo di aver mischiato troppe cose...fa parte di un progetto che uso come "appunti" sulla combobox. Vedi tu se può ispirarti qualcosa di utile...
Ciao

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

joeputrisino Profilo | Junior Member

Grazie come sempre. Lo guardo in settimana e ti faccio sapere. Spero di restituirti il favore uno di questi giorni. A buon rendere. Ciao
Maurizio Maccarrone
New Phonia Ltd
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5