Sorot item ListBox berdasarkan nilai dari kelas

Apakah mungkin untuk mengulang item dalam ListBox dan menyorot atau menunjukkan tidak tersedianya item dengan memeriksa nilai suatu kelas?

Pada dasarnya, mendapatkan kelas Game dan di dalamnya tersimpan info apakah Game Tersedia jadi saya perlu memeriksa kelas ini saat mengulang Item ListBox dan entah bagaimana menunjukkan di ListBox jika GameAvailable = false.

Sampai pada titik ini dan tidak yakin bagaimana melanjutkannya:

private void HighlightUnavailable()
    {
        foreach(string item in listbox_consoles.Items)
        {
            foreach (Products.Game game in GameService.AllGames())
            {
                if (item == game.GameName.ToString())
                {
                    if (game.GameAvailable)
                    {

                    }
                }
            }
        }
    }

person Pawel    schedule 05.05.2020    source sumber
comment
Mengapa tidak menghapus item yang tidak diinginkan (dengan GameAvailable == false)?   -  person Dmitry Bychenko    schedule 05.05.2020
comment
@DmitryBychenko ini untuk Formulir di mana pengguna dapat menampilkan semua Game yang tersedia tetapi memerlukan indikasi pada daftar produk mana yang tersedia.   -  person Pawel    schedule 05.05.2020
comment
Apa ini? WinForms, WPF, ..dll?   -  person    schedule 05.05.2020
comment
@JQSOFT permintaan maaf, saya harus menyebutkannya pada awalnya - ini adalah WinForms.   -  person Pawel    schedule 06.05.2020


Jawaban (1)


Ya, itu mungkin dengan cara:

  • Ikat ListBox ke GameService.AllGames() yang saya yakin mengembalikan daftar atau array objek Game.

  • Setel ListBox. DrawMode ke DrawMode.OwnerDrawFixed dan menangani rel ListBox.DrawItem untuk menggambar item sesuai dengan GameAvailable propertinya.

Dengan asumsi nama kontrol adalah Form1 dan listBox1, tambahkan konstruktor Form1:

public Form1()
{
    InitializeComponent();
    //...

    listBox1.DrawMode = DrawMode.OwnerDrawFixed;
    listBox1.DrawItem += (s, e) => OnListBoxDrawItem(s, e); 
    listBox1.DataSource = GameService.AllGames();
}

Katakanlah Anda ingin menampilkan game yang tersedia dengan warna hijau dan sisanya dengan warna latar depan merah.

private void OnListBoxDrawItem(object sender, DrawItemEventArgs e)
{
    //Comment if you don't need to show the selected item(s)...
    e.DrawBackground();

    if (e.Index == -1) return;

    var game = listBox1.Items[e.Index] as Game;
    var foreColor = game.GameAvailable ? Color.Green : Color.Red;

    //Pass the listBox1.BackColor instead of the e.BackColor 
    //if you don't need to show the selection...
    TextRenderer.DrawText(e.Graphics, game.GameName, e.Font,
        e.Bounds, foreColor, e.BackColor,
        TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
}

... atau dengan warna latar belakang berbeda:

private void OnListBoxDrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index == -1) return;

    var game = listBox1.Items[e.Index] as Game;          

    var backColor = e.State.HasFlag(DrawItemState.Selected)
        ? e.BackColor
        : game.GameAvailable
        ? Color.LightGreen
        : listBox1.BackColor;

    //Or this if you don't need to show the selection ...
    //var backColor = game.GameAvailable
    //  ? Color.LightGreen
    //  : listBox1.BackColor;

    using (var br = new SolidBrush(backColor))
        e.Graphics.FillRectangle(br, e.Bounds);

    TextRenderer.DrawText(e.Graphics, game.GameName, e.Font,
        e.Bounds, Color.Black, backColor,
        TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
}

... atau dengan beberapa ya Ya dan tidak No gambar dari sumber daya Anda:

Bitmap YesImage, NoImage;

public Form1()
{
    InitializeComponent();
    //...

    YesImage = Properties.Resources.YesImage;
    NoImage = Properties.Resources.NoImage;

    listBox1.DrawMode = DrawMode.OwnerDrawFixed;
    listBox1.DrawItem += (s, e) => OnListBoxDrawItem(s, e);
    listBox1.DataSource = GameService.AllGames();
    this.FormClosed += (s, e) => { YesImage.Dispose(); NoImage.Dispose(); };
}

private void OnListBoxDrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index == -1) return;

    var game = listBox1.Items[e.Index] as Game;
    var backColor = e.State.HasFlag(DrawItemState.Selected)
        ? e.BackColor
        : listBox1.BackColor;
    var bmp = game.GameAvailable ? YesImage : NoImage;
    var rectImage = new Rectangle(
        3, e.Bounds.Y + ((e.Bounds.Height - bmp.Height) / 2),
        bmp.Width, bmp.Height
        );
    var rectTxt = new Rectangle(
        rectImage.Right + 3, e.Bounds.Y,
        e.Bounds.Right - rectImage.Right - 3,
        e.Bounds.Height
        );

    using (var br = new SolidBrush(backColor))
        e.Graphics.FillRectangle(br, e.Bounds);

    e.Graphics.DrawImage(bmp, rectImage);

    TextRenderer.DrawText(e.Graphics, game.GameName, e.Font,
            rectTxt, Color.Black, backColor,
            TextFormatFlags.Left | TextFormatFlags.VerticalCenter);
}

SOQ61607771

person Community    schedule 07.05.2020
comment
Terima kasih, ini berhasil dengan baik! Gunakan gambar ya/tidak dan menurut saya itu yang terbaik. - person Pawel; 12.05.2020
comment
Bolehkah saya bertanya dari mana Anda mendapatkan ikon merah & hijau? Yang saya punya tidak terlihat sebagus yang ada di pratinjau Anda. Terima kasih! - person Pawel; 14.05.2020
comment
@Pawel Ini sobat i.stack.imgur.com/Xzh8t.png dan i.stack.imgur.com/FZqUz.png - person ; 14.05.2020