изменить цвет строки, выбранный в ListBox WindowsForm C # - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь с помощью этого кода (c #, windowsform, VS2017):

dynamic model;
private void ListBox_DrawItem(object sender, DrawItemEventArgs e)
{
    try
    {
        if (e.Index < 0) return;
        if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
            e = new DrawItemEventArgs(e.Graphics,
                                      e.Font,
                                      e.Bounds,
                                      e.Index,
                                      e.State ^ DrawItemState.Selected,
                                      e.ForeColor,
                                      Color.LimeGreen);

        e.DrawBackground();

        e.Graphics.DrawString(listBox.Items.OfType<Game>().Select(table => table.name).ElementAt(e.Index), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
        e.DrawFocusRectangle();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "MainForm.ListBox_DrawItem()", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Чтобы изменить цвет строки выбранного элемента моего ListBox (который по умолчанию синий) на другой цвет (здесь, в зеленом)

вот рендеринг: LisBox: изменить выбранный элемент цвета

Но я бы хотел выбрать между 4 различными объектами с переключателем, но больше ничегоработает:

        dynamic model;
    private void ListBox_DrawItem(object sender, DrawItemEventArgs e)
    {
        try
        {
            if (e.Index < 0) return;
            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
                e = new DrawItemEventArgs(e.Graphics,
                                          e.Font,
                                          e.Bounds,
                                          e.Index,
                                          e.State ^ DrawItemState.Selected,
                                          e.ForeColor,
                                          Color.LimeGreen);

            e.DrawBackground();

            switch (selectedModel)
            {
                case "Game":
                    model = listBox.Items.Cast<Game>().Select(table => table.name).ElementAt(e.Index);
                    break;
                case "Gender":
                    model = listBox.Items.Cast<Gender>().Select(table => table.name).ElementAt(e.Index);
                    break;
            }

            e.Graphics.DrawString(model, e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
            e.DrawFocusRectangle();
        }

Я безуспешно пытался использовать: OfType <> и Cast <>

model = listBox.Items.Cast<Game>().Select(table => table.name).ElementAt(e.Index);

Или

model = listBox.Items.OfType<Game>().Select(table => table.name).ElementAt(e.Index);

Исключение: 'System.InvalidCastException'в System.Core.dll

Спасибо за вашу помощь, и если я не достаточно ясно, я заранее извиняюсь, я пытаюсь упростить изображения для моего запроса.


Редактировать:

Я отвечаю сам, и это, возможно, помогло не одному!Я закончил тем, что нашел решение (но не очень чистое, я думаю), вот она:

if (listBox.SelectedItem.GetType() == typeof(Game))
{
    e.Graphics.DrawString(listBox.Items.Cast<Game>().Select(table => table.name).ElementAt(e.Index), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
    e.DrawFocusRectangle();
}
if (listBox.SelectedItem.GetType() == typeof(Gender))
{
    e.Graphics.DrawString(listBox.Items.Cast<Gender>().Select(table => table.name).ElementAt(e.Index), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);
    e.DrawFocusRectangle();
}

Очевидно, переключатель не работает, но я не понимаю, почему?

Так что, если выиметь лучшую идею, чтобы сделать его более компактным и элегантным, я беру!Спасибо всем,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...