C# ListView Detail, выделите одну ячейку
Я использую ListView в C#, чтобы сделать сетку. Я хотел бы найти способ выделить конкретную ячейку программно. Мне нужно только выделить одну ячейку.
Я экспериментировал с подэлементами, нарисованными владельцем, но используя приведенный ниже код, я получил выделенные ячейки, но без текста! Есть какие-нибудь идеи о том, как заставить это работать? Спасибо за вашу помощь.
//m_PC.Location is the X,Y coordinates of the highlighted cell.
void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
if ((e.ItemIndex == m_PC.Location.Y) && (e.Item.SubItems.IndexOf(e.SubItem) == m_PC.Location.X))
e.SubItem.BackColor = Color.Blue;
else
e.SubItem.BackColor = Color.White;
e.DrawBackground();
e.DrawText();
}
3 ответа
Вы можете сделать это без рисования владельцем списка:
// create a new list item with a subitem that has white text on a blue background
ListViewItem lvi = new ListViewItem( "item text" );
lvi.UseItemStyleForSubItems = false;
lvi.SubItems.Add( new ListViewItem.ListViewSubItem( lvi,
"subitem", Color.White, Color.Blue, lvi.Font ) );
Аргументы Color для конструктора ListViewSubItem управляют цветом переднего плана и фона подэлемента. Критическая вещь, которую нужно сделать здесь, установлена UseItemStyleForSubItems
False в элементе списка, иначе изменения цвета будут игнорироваться.
Я думаю, что ваше решение для рисования владельцем также сработало бы, но вы должны помнить, чтобы изменить цвет текста (переднего плана), когда вы измените цвет фона на синий, иначе текст будет трудно увидеть.
Догадаться. Вот код для переключения выделения определенного подпункта.
listView1.Items[1].UseItemStyleForSubItems = false;
if (listView1.Items[1].SubItems[10].BackColor == Color.DarkBlue)
{
listView1.Items[1].SubItems[10].BackColor = Color.White;
listView1.Items[1].SubItems[10].ForeColor = Color.Black;
}
else
{
listView1.Items[1].SubItems[10].BackColor = Color.DarkBlue;
listView1.Items[1].SubItems[10].ForeColor = Color.White;
}
В моем случае я хотел выделить определенные строки, включая все поля. Таким образом, каждая строка в моем списке с "Medicare" в первом столбце выделяет всю строку:
public void HighLightListViewRows(ListView xLst)
{
for (int i = 0; i < xLst.Items.Count; i++)
{
if (xLst.Items[i].SubItems[0].Text.ToString() == "Medicare")
{
for (int x = 0; x < xLst.Items[i].SubItems.Count; x++)
{
xLst.Items[i].SubItems[x].BackColor = Color.Yellow;
}
}
}
}