2009-12-27 3 views
5

Ho ricavato una classe da ComboBox, ne ho fatto una lista di proprietari disegnata (stile DrawMode.OwnerDrawVariable), e sovrascrivendo OnMeasureItem e OnDrawItem aggiungo elementi speciali all'elenco a discesa (separatori, ad esempio) che sono di dimensioni inferiori/superiori rispetto agli oggetti normali che abitano il controllo.Il proprietario di dimensioni variabili disegna ComboBox; elencare non dimensionare correttamente

Ora, il problema che sto riscontrando e che non riesco a risolvere efficacemente è il dimensionamento dell'elenco a discesa: c'è un brutto spazio vuoto alla fine dell'elenco quando scende. Pensavo di averlo risolto impostando la proprietà DropDownHeight del ComboBox sulla somma di tutti gli elementi, ma questo non sembra funzionare all'ora. A volte, su un numero casuale di elementi, ritorna lo spazio bianco vuoto di rovina. Questo è un problema insolito, ma si spera che sia comune e facilmente risolvibile.

Come è possibile ottenere l'elenco a discesa del ComboBox per ridimensionare esattamente la dimensione occupata dagli elementi al suo interno?

risposta

4

Sto vedendo un bug piuttosto stupido nel metodo ComboBox.UpdateDropDownHeight(). Quando la proprietà DropDownHeight corrisponde al valore predefinito, calcola un'altezza personalizzata per adattare il menu a discesa al numero di elementi. Lo fa anche quando hai cambiato DrawMode, questo è assolutamente sbagliato.

La soluzione:

int height = ...; // Your code here 
    if (height == 106) ++height; 
    comboBox1.DropDownHeight = height; 

si otterrà un gap di un pixel, si dovrebbe essere in grado di nascondere che nel vostro OnDrawItem() sovraccarico.

+0

Questo errore si estende un po 'più in profondità. Il valore predefinito di DropDownHeight si basa sulla dimensione del carattere degli oggetti nella casella combinata. Qualsiasi alterazione dell'altezza di un singolo elemento che non è basata su una modifica della dimensione del carattere causerà un problema con la proprietà DropDownHeight. – Stewbob

+1

No, la dimensione predefinita è hardcoded in una costante, avere un look-see nella Reference Source. È denominato "DefaultDropDownHeight". Se la tua teoria è corretta, dovresti vederlo molto più frequentemente. Soprattutto dal momento che implementate OnMeasureItem, l'altezza dell'oggetto sarà sempre non standard. Sono costretto a indovinare qui, la tua domanda non ha alcun indizio su cosa potrebbe far scattare l'apparizione del divario. –

+0

@nobugz: Sì, hai ragione. Ho digitato più velocemente di quanto pensassi. L'altezza dell'articolo si basa sulla dimensione del carattere.Che, in alcuni casi, è ciò che viene utilizzato per determinare il valore massimo di DropDownHeight. – Stewbob

1

Credo che il problema nel modo in cui si sta calcolando la vostra discesa altezza lista, credo che sia dovrebbe occupare in questo modo:

comboBox.DropDownHeight = N_of_items * item_height; 

l'altezza totale della lista a discesa dovrebbe includere anche il suo bordo superiore e inferiore altezza, quindi se volete fare smth come questo:

comboBox.DropDownHeight = N_of_items * item_height + SystemInformation.BorderSize.Height*2; 

dovrebbe fare il trucco e mostrare l'elenco a discesa senza zone bianche

speranza che questo aiuta, r egards

2

Ho passato molto tempo a combattere questo stesso problema.

Quando si aggiungono elementi personalizzati alla casella combinata, DropDownHeight non verrà impostato correttamente. Per garantire di averlo impostato correttamente ogni volta, è necessario dirottare un messaggio di Windows.

This post mostra come. Tieni semplicemente traccia dell'altezza di tutti gli elementi (standard e personalizzati) nella tua casella combinata, quindi imposta l'altezza totale della parte del menu a discesa, come mostrato nell'esempio.