Dettaglio ListView C #, Evidenzia una singola cella
-
03-07-2019 - |
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();
}
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;
}
}
}
}