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();
}

person Mike Christiansen    schedule 18.10.2008    source източник


Отговори (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 в елемента от списъка, в противен случай вашите промени в цвета ще бъдат игнорирани.

Мисля, че вашето решение за чертане на собственик също щеше да работи, но трябва да запомните да промените цвета на текста (преден план), когато промените фона на син, в противен случай текстът ще бъде трудно видим.

person Charlie    schedule 18.10.2008

Разбрах го. Ето код за превключване на осветяването на конкретен поделемент.

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;
}
person Mike Christiansen    schedule 18.10.2008

В моя случай исках да маркирам конкретни редове, включително всички полета. Така че всеки ред в моя списъчен изглед с „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;
                    }
                }
            }
        }
person Chris Asquith    schedule 22.10.2012