C# WindowsForms の CheckedListBox でチェックされているアイテムの色を変更したいと考えています。
誰でもこの問題を解決するのを手伝ってくれますか!
C# WindowsForms の CheckedListBox でチェックされているアイテムの色を変更したいと考えています。
誰でもこの問題を解決するのを手伝ってくれますか!
これで始められるはずです。a をサブクラス化しCheckedListBox
、描画イベントをオーバーライドしました。その結果、リスト内のすべてのチェックされた項目が赤い背景で描画されます。
これをいじって、チェックボックスの後ろの領域も別の色にしたい場合は、 をe.Graphics.FillRectangle
呼び出す前に を使用しbase.OnDrawItem
ます。
class ColouredCheckedListBox : CheckedListBox
{
protected override void OnDrawItem(DrawItemEventArgs e)
{
DrawItemEventArgs e2 =
new DrawItemEventArgs
(
e.Graphics,
e.Font,
new Rectangle(e.Bounds.Location, e.Bounds.Size),
e.Index,
e.State,
e.ForeColor,
this.CheckedIndices.Contains(e.Index) ? Color.Red : SystemColors.Window
);
base.OnDrawItem(e2);
}
}
チェックボックスの3つの状態ごとにアイテムのテキストの色を変えるという同じ欲求があったので、私を正しい道に導いてくれたJonに感謝します。
CheckedListBox のこのサブクラスを思いつきました。背景色ではなく、アイテムのテキストを変更します。もちろん、設計時またはコードでユーザーが3色を設定できます。
また、デザイナーでコントロールを表示するときにエラーが発生するという問題も修正されています。また、ソリューションで発生したと思われる問題を克服する必要がありました。アイテムが選択されている場合、base.OnDrawItem メソッドは、オーバーライドされた OnDrawItem メソッドで設定された色の選択を消去します。これは、選択されていることを示す e.State の部分を削除して、選択されたアイテムの背景が色付きでなくなるという犠牲を払ってこれを行い、base.OnDrawItem で選択されたアイテムのルック アンド フィールにならないようにしました。ユーザーには、どれが選択されているかを示すフォーカス四角形がまだ表示されるので、これは問題ありません。
うまくいけば、これは他の人に役立つかもしれません。ネットで調べたところ、まとまりのあるソリューション (完全な OnDrawItem メソッドであっても) はあまり見つかりませんでした。
using System;
using System.Windows.Forms;
using System.Drawing;
namespace MyNameSpace
{
/// <summary>
/// This is a CheckedListBox that allows the item's text color to be different for each of the 3 states of the corresponding checkbox's value.
/// Like the base CheckedListBox control, you must handle setting of the indeterminate checkbox state yourself.
/// Note also that this control doesn't allow highlighting of the selected item since that obscures the item's special text color which has the special meaning. But
/// the selected item is still known to the user by the focus rectangle it will have surrounding it, like usual.
/// </summary>
class ColorCodedCheckedListBox : CheckedListBox
{
public Color UncheckedColor { get; set; }
public Color CheckedColor { get; set; }
public Color IndeterminateColor { get; set; }
/// <summary>
/// Parameterless Constructor
/// </summary>
public ColorCodedCheckedListBox()
{
UncheckedColor = Color.Green;
CheckedColor = Color.Red;
IndeterminateColor = Color.Orange;
}
/// <summary>
/// Constructor that allows setting of item colors when checkbox has one of 3 states.
/// </summary>
/// <param name="uncheckedColor">The text color of the items that are unchecked.</param>
/// <param name="checkedColor">The text color of the items that are checked.</param>
/// <param name="indeterminateColor">The text color of the items that are indeterminate.</param>
public ColorCodedCheckedListBox(Color uncheckedColor, Color checkedColor, Color indeterminateColor)
{
UncheckedColor = uncheckedColor;
CheckedColor = checkedColor;
IndeterminateColor = indeterminateColor;
}
/// <summary>
/// Overriden draw method that doesn't allow highlighting of the selected item since that obscures the item's text color which has desired meaning. But the
/// selected item is still known to the user by the focus rectangle being displayed.
/// </summary>
/// <param name="e"></param>
protected override void OnDrawItem(DrawItemEventArgs e)
{
if (this.DesignMode)
{
base.OnDrawItem(e);
}
else
{
Color textColor = this.GetItemCheckState(e.Index) == CheckState.Unchecked ? UncheckedColor : (this.GetItemCheckState(e.Index) == CheckState.Checked ? CheckedColor : IndeterminateColor);
DrawItemEventArgs e2 = new DrawItemEventArgs
(e.Graphics,
e.Font,
new Rectangle(e.Bounds.Location, e.Bounds.Size),
e.Index,
(e.State & DrawItemState.Focus) == DrawItemState.Focus ? DrawItemState.Focus : DrawItemState.None, /* Remove 'selected' state so that the base.OnDrawItem doesn't obliterate the work we are doing here. */
textColor,
this.BackColor);
base.OnDrawItem(e2);
}
}
}
}