2011-01-12 13 views
20

私はいくつかの状況で無効/期限切れの可能性がある情報/オプション/項目を含む数多くのコンボボックスを含むフォームを持っているというジレンマを持っています。winformsコンボボックスの個々のアイテムの色を指定しますか?

私は単にアイテムから古い情報を削除することはできませんが、オプションが無効な場合にユーザーに視覚的な手がかりを与えたいと考えています。

&が無効である場合は、アイテム(おそらく赤色)に色付けすることを考えていました。私は必ずしもユーザーが無効なオプションを選択するのを防ぐ必要はありません。そうしていることを視覚的に認識させるだけです。

これはできますか?コンボボックスアイテムのcolo(u)rを変更できますか?

ありがとう、

+0

私はデフォルトのアイテムの描画動作をオーバーライドしません。 ComboBoxのほかに何かが必要です。 – Bitterblue

答えて

37

ComboBoxのDrawItemイベントを試すことができます。あなたの日付をリストに残し、IDと比較してアイテムを磨く。このイベントを発生させる

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); 
} 

(@Boluのおかげで)

あなたは 火災にOwnerDrawVariable OwnerDrawFixed /にcomboBox_DrawItem

+0

編集していただきありがとうございます。 '//アイテムが選択されているかどうかに基づいてforecolorを決める'は、少しでも私を捨ててしまっています。選択をサポートするコードがないようです...私は本当にこの機能が必要だとは思わないちょうどこれがc&pエラーか私が気づいている必要があるものかどうか疑問に思っていますか? – Mike

+0

これでselectedIndexChangedに対してこの操作を実行しますか?そうなら、これを使うことはできません。これはロード時の色を決定し、あなたが今日よりも前の日付かどうかをチェックします。選択したアイテムにのみ必要な場合は、アイテムを再読み込みし、このイベントで赤色にしたいアイテムだけをペイントする方法がないとは思いません。 – Pabuc

+0

すべての商品に必要です。これに加えて、自分自身の「有効/無効」ルールに基づいて、フォーム上の他のコンボボックスにエフェクトをカスケード接続することが私の意図です。したがって、CBO#1から項目を選択すると結果がCBO#2とCBO#3の「some」項目から選択できなくなり、新しい色で再ペイントする必要があります。 – 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)); 

ComboBox.DrawMode を変更する必要がありますソースURLページ: http://www.tyrodeveloper.com/2012/04/color-in-combobox-item.html

1

Changing color of combobox back color

このコードを使用して、コンボボックスのバックカラーを変更することができます。

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"); 
    } 
} 
} 
関連する問題