web-dev-qa-db-ja.com

C#:リストボックスのアイテムの色を変更する

windowsフォームでプログラムに取り組んでいます。リストボックスがあり、データを検証しています。正しいデータを緑色でリストボックスに追加し、無効なデータを赤色で追加します。また、リストボックスから下に自動スクロールします。アイテムが追加され、ありがとう

コード:

try
{
    validatedata;
    listBox1.Items.Add("Successfully validated the data  : "+validateddata);
}
catch()
{
    listBox1.Items.Add("Failed to validate data: " +validateddata);
}
15
BOSS

WinFormsを想定して、これは私が行うことです。

まず、リストボックスに追加するアイテムを含むクラスを作成します。

public class MyListBoxItem {
    public MyListBoxItem(Color c, string m) { 
        ItemColor = c; 
        Message = m;
    }
    public Color ItemColor { get; set; }
    public string Message { get; set; }
}

次のコードを使用して、リストボックスにアイテムを追加します。

listBox1.Items.Add(new MyListBoxItem(Colors.Green, "Validated data successfully"));
listBox1.Items.Add(new MyListBoxItem(Colors.Red, "Failed to validate data"));

ListBoxのプロパティで、DrawModeをOwnerDrawFixedに設定し、DrawItemイベントのイベントハンドラーを作成します。これにより、各アイテムを好きなように描くことができます。

DrawItemイベント:

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    MyListBoxItem item = listBox1.Items[e.Index] as MyListBoxItem; // Get the current item and cast it to MyListBoxItem
    if (item != null) 
    {
        e.Graphics.DrawString( // Draw the appropriate text in the ListBox
            item.Message, // The message linked to the item
            listBox1.Font, // Take the font from the listbox
            new SolidBrush(item.ItemColor), // Set the color 
            0, // X pixel coordinate
            e.Index * listBox1.ItemHeight // Y pixel coordinate.  Multiply the index by the ItemHeight defined in the listbox.
        );
    }
    else 
    {
         // The item isn't a MyListBoxItem, do something about it
    }
}

いくつかの制限があります。主なものは、独自のクリックハンドラーを記述し、適切な項目を再描画して選択されたように表示する必要があることです。これは、WindowsがOwnerDrawモードではそれを行わないためです。ただし、これがアプリケーションで発生していることのログを目的としている場合は、選択可能に表示されるアイテムについて気にする必要はありません。

最後のアイテムにスクロールするには、

listBox1.TopIndex = listBox1.Items.Count - 1;
34
Neil

実際の質問に対する回答ではありませんが、ObjectListViewを確認することをお勧めします。リストボックスではなくリストビューですが、非常に柔軟で使いやすいです。データを表すために単一の列で使用できます

各線のステータスを色分けするために使用します

http://objectlistview.sourceforge.net/cs/index.html

これはもちろんWinForms用です。

2
ScruffyDuck

いかがですか

            MyLB is a listbox

            Label ll = new Label();
            ll.Width = MyLB.Width;
            ll.Content = ss;
            if(///<some condition>///)
                ll.Background = Brushes.LightGreen;
            else
                ll.Background = Brushes.LightPink;
            MyLB.Items.Add(ll);
0
Dan Hed