Czy można sformatować element ComboBox w języku C#? Na przykład, w jaki sposób mogę pogrubić przedmiot, zmienić kolor jego tekstu itp.?Zmiana formatu elementu ComboBox
Odpowiedz
Można to zrobić poprzez ustawienie DrawMode do OwnerDrawFixed
który pozwala ręcznie rysować elementy używając zdarzenie DrawItem.
comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem);
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) {
Font font = comboBox1.Font;
Brush brush = Brushes.Black;
string text = comboBox1.Items[e.Index];
if (you want bold)
font = new Font(font, FontStyle.Bold);
if (you want green)
brush = Brushes.Green;
e.Graphics.DrawString(text, font, brush, e.Bounds);
}
Tak, ale z tworzenia własnego ComboBox z niestandardowym rysunku See here on MSDN
Nie, nie ma wbudowanej właściwości, aby to zrobić. Musisz zbudować własną kontrolę i nadpisać renderowanie.
Tak stary, jak ten post, uznałem go za użyteczny jako punkt wyjścia do wyszukiwania, ale zakończył się uzyskaniem lepszych wyników przy użyciu metody pokazanej jako here przez @Paul.
Oto kod, którego użyłem, aby warunkowo sprawić, że elementy w polu kombi wyglądają na pogrubione. Uważam, że odpowiedź oznaczona jako poprawna dla tego pytania ma dziwne zachowanie - po najechaniu kursorem element staje się nieco bardziej wyrazisty i pozostaje taki sam jeśli jest przerysowywany. Ten kod powoduje bardziej naturalny wygląd:
private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == -1)
return;
ComboBox combo = ((ComboBox)sender);
using (SolidBrush brush = new SolidBrush(e.ForeColor))
{
Font font = e.Font;
if (/*Condition Specifying That Text Must Be Bold*/)
font = new System.Drawing.Font(font, FontStyle.Bold);
e.DrawBackground();
e.Graphics.DrawString(combo.Items[e.Index].ToString(), font, brush, e.Bounds);
e.DrawFocusRectangle();
}
}
Wystarczy dodać do odpowiedzi dostarczonych przez Dan, nie zapomnij, że jeśli związany listę do DataSource, zamiast tylko o ComboBox z prostych ciągów , nie będzie można przerysować wpisu za pomocą combo.Items[e.Index].ToString()
.
Jeśli na przykład przywiązałeś ComboBox do DataTable i spróbujesz użyć kodu w odpowiedzi Dana, skończysz z ComboBox zawierającym System.Data.DataRowView
, ponieważ każdy element na liście nie jest ciąg, to DataRowView.
Kod w tym przypadku byłoby coś jak poniżej:
private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == -1)
return;
ComboBox combo = ((ComboBox)sender);
using (SolidBrush brush = new SolidBrush(e.ForeColor))
{
Font font = e.Font;
DataRowView item = (DataRowView)combo.Items[e.Index];
if (/*Condition Specifying That Text Must Be Bold*/) {
font = new System.Drawing.Font(font, FontStyle.Bold);
}
else {
font = new System.Drawing.Font(font, FontStyle.Regular);
}
e.DrawBackground();
e.Graphics.DrawString(item.Row.Field<String>("DisplayMember"), font, brush, e.Bounds);
e.DrawFocusRectangle();
}
}
Gdzie "DisplayMember"
jest nazwa pola mają być wyświetlane na liście (ustawionej w nieruchomości ComboBox1.DisplayMember
).