Вопрос

Я использую 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();
}
Это было полезно?

Решение

Вы можете сделать это без рисования владельцем списка:

// 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;
                    }
                }
            }
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top