Domanda

Sto usando un ListView in C # per creare una griglia. Vorrei scoprire un modo per evidenziare una cella specifica, a livello di programmazione. Devo solo evidenziare una cella.

Ho sperimentato i subitem Disegnati dal proprietario, ma usando il codice qui sotto ottengo celle evidenziate, ma nessun testo! Ci sono idee su come farlo funzionare? Grazie per il tuo aiuto.

//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();
}
È stato utile?

Soluzione

Puoi farlo senza che il proprietario stia disegnando l'elenco:

// 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 ) );

Gli argomenti Color al costruttore ListViewSubItem controllano il colore di primo piano e di sfondo del sottoelemento. La cosa fondamentale da fare qui è impostare UseItemStyleForSubItems su False sulla voce dell'elenco, altrimenti i cambiamenti di colore verranno ignorati.

Penso che anche la tua soluzione di disegno del proprietario avrebbe funzionato, ma devi ricordare di cambiare il colore del testo (primo piano) quando cambi lo sfondo in blu, altrimenti il ??testo sarà difficile da vedere.

Altri suggerimenti

Capito. Ecco il codice per attivare / disattivare l'evidenziazione di un elemento secondario specifico.

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

Nel mio caso, volevo evidenziare righe specifiche, inclusi tutti i campi. Quindi ogni riga nella mia lista visualizza con " Medicare " nella prima colonna viene evidenziata l'intera riga:

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;
                    }
                }
            }
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top