Я пытаюсь с помощью этого кода (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();
}
Очевидно, переключатель не работает, но я не понимаю, почему?
Так что, если выиметь лучшую идею, чтобы сделать его более компактным и элегантным, я беру!Спасибо всем,