С# ListView Detail, выделите одну ячейку
Я использую ListView в С# для создания сетки. Я хотел бы узнать, как можно выделить конкретную ячейку, программно. Мне нужно выделить только одну ячейку.
Я экспериментировал с подэлементами Owner Drawn, но используя приведенный ниже код, я получаю выделенные ячейки, но не текст! Есть ли идеи о том, как заставить это работать? Благодарим за помощь.
//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();
}
Ответы
Ответ 1
Вы можете сделать это без создания чертежа владельца:
// 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 в элементе списка, иначе ваши изменения цвета будут проигнорированы.
Я думаю, что ваше решение для рисования было бы неплохо, но вы должны помнить об изменении цвета текста (переднего плана) при изменении фона на синий, иначе текст будет трудно увидеть.
Ответ 2
Выяснил это. Здесь код для переключения подсветки конкретного элемента.
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;
}
Ответ 3
В моем случае я хотел выделить определенные строки, включая все поля. Таким образом, каждая строка в моем списке с помощью "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;
}
}
}
}