2011-01-12 15 views
20

Mam dylemat polegający na tym, że mam formularz zawierający wiele pól combobox zawierających informacje/opcje/pozycje, które mogą być nieważne/nieaktualne w pewnych okolicznościach.Kolor poszczególnych przedmiotów w WinForm ComboBox?

Nie mogę po prostu usunąć nieaktualnych informacji z pozycji, ale chcę dać użytkownikowi wizualną wskazówkę, gdy opcje są nieprawidłowe.

Miałem na myśli kolorowanie w elementach (prawdopodobnie czerwone), aby wskazać, czy są niepoprawne &. Nie muszę koniecznie uniemożliwiać użytkownikowi wybrania nieprawidłowej opcji, tylko uświadomić im, że robią to.

Czy to można zrobić? Czy możesz - dyamicznie - zmienić colo (u) r elementów combobox?

Dzięki,

+0

Cholera, nie będę nadpisywać domyślnego zachowania rysowania elementów. Musi wziąć coś innego oprócz ComboBox. – Bitterblue

Odpowiedz

37

można spróbować DrawItem wydarzenie ComboBox. Zachowaj daty na liście i porównaj je z identyfikatorami i wyczyść przedmioty.

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) 
{  
    // Draw the background 
    e.DrawBackground();   

    // Get the item text  
    string text = ((ComboBox)sender).Items[e.Index].ToString(); 

    // Determine the forecolor based on whether or not the item is selected  
    Brush brush; 
    if (YourListOfDates[e.Index] < DateTime.Now)// compare date with your list. 
    { 
     brush = Brushes.Red; 
    } 
    else 
    { 
     brush = Brushes.Green; 
    } 

    // Draw the text  
    e.Graphics.DrawString(text, ((Control)sender).Font, brush, e.Bounds.X, e.Bounds.Y); 
} 

Aby odpalić to wydarzenie (dzięki @Bolu)

Musisz zmienić ComboBox.DrawMode do OwnerDrawFixed/OwnerDrawVariable do ogniem comboBox_DrawItem

+0

Dzięki za edycję. "// Wyznaczanie koloru w oparciu o to, czy element jest zaznaczony" trochę mnie wyrzuca, wydaje się, że nie ma tu żadnego kodu wspierającego wybór, czy nie ... Nie sądzę, że naprawdę potrzebuję tej funkcjonalności Zastanawiam się, czy jest to błąd c & p, czy coś, o czym muszę wiedzieć? – Mike

+0

Więc będziesz wykonywać tę operację na selectedIndexChanged? Jeśli tak, nie możesz tego użyć. Określa kolory na ładunek i sprawdza, czy daty są wcześniej niż dzisiaj, czy nie. Jeśli potrzebujesz tego tylko dla wybranego przedmiotu, nie sądzę, żeby był inny sposób na jego wykonanie, a następnie ponowne załadowanie przedmiotów i pomalowanie tylko tego przedmiotu, który chcesz z tym wydarzeniem czerwonym. – Pabuc

+0

Potrzebuję go do wszystkich przedmiotów. Oprócz tego zamierzam przenieść efekt kaskady na inne pola combobox w moim formularzu, w oparciu o własne "ważne/nieważne" reguły. Wybierasz więc przedmiot z CBO # 1, a wynikiem są 'niektóre' przedmioty z CBO # 2 i CBO # 3 są teraz nieważne do wyboru i dlatego wymagają odmalowania nowym kolorem. – Mike

5
///The ComboBoxCustom Control: 

using System; 
using System.Windows.Forms; 
using System.Drawing; 
namespace TyroDeveloper 
{ 
    public class ComboBoxCustom:ComboBox 
    { 
     public ComboBoxCustom() { 
      this.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; 
     } 
     protected override void OnDrawItem(DrawItemEventArgs e) 
     { 
      base.OnDrawItem(e); 
      e.DrawBackground(); 
      ComboBoxItem item = (ComboBoxItem)this.Items[e.Index]; 
      Brush brush = new SolidBrush(item.ForeColor); 
      if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
      { brush = Brushes.Yellow; } 
      e.Graphics.DrawString(item.Text, this.Font, brush, e.Bounds.X, e.Bounds.Y); 
     } 
    } 
    public class ComboBoxItem 
    { 
     public ComboBoxItem() { } 

     public ComboBoxItem(string pText, object pValue) 
     { 
      text = pText; val = pValue; 
     } 

     public ComboBoxItem(string pText, object pValue, Color pColor) 
     { 
      text = pText; val = pValue; foreColor = pColor; 
     } 

     string text = ""; 
     public string Text { 
      get { return text; } set { text = value; } 
     } 

     object val; 
     public object Value { 
      get { return val; } set { val = value; } 
     } 

     Color foreColor = Color.Black; 
     public Color ForeColor { 
      get { return foreColor; } set { foreColor = value; } 
     } 

     public override string ToString() 
     { 
      return text; 
     } 
    } 
} 

//To add the items: 

comboBoxCustom1.Items.Add(new ComboBoxItem("México","0",Color.Green)); 
comboBoxCustom1.Items.Add(new ComboBoxItem("USA", "1", Color.Blue)); 
comboBoxCustom1.Items.Add(new ComboBoxItem("China", "2", Color.Red)); 

się strona ze źródłem: http://www.tyrodeveloper.com/2012/04/color-in-combobox-item.html

1

Changing color of combobox back color

Możesz użyć tego kodu do zmiany koloru tyłu combobox.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Comboboxrenklendir 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 



    private void cmbrenkli_DrawItem(object sender, DrawItemEventArgs e) 
    { 




     Color HighlightColor = Color.Red; 

     if (e.Index >=0) 
     { 

      //int sayi = cmbrenkli.Items.Count; 

      string deger = cmbrenkli.Items[e.Index].ToString(); 

      if (deger == "30"|| deger == "50") 
      { 
       e.Graphics.FillRectangle(new SolidBrush(HighlightColor), e.Bounds); 
      } 



      e.Graphics.DrawString(cmbrenkli.Items[e.Index].ToString(), e.Font, new SolidBrush(cmbrenkli.ForeColor), new Point(e.Bounds.X, e.Bounds.Y)); 

      e.DrawFocusRectangle(); 

     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     cmbrenkli.Items.Add("10"); 
     cmbrenkli.Items.Add("20"); 
     cmbrenkli.Items.Add("30"); 
     cmbrenkli.Items.Add("40"); 
     cmbrenkli.Items.Add("50"); 
    } 
} 
} 
Powiązane problemy