Gå til innhold

Farge på rad i ListBox (Windows Forms)


Anbefalte innlegg

Jeg er på utkikk etter hvordan jeg kan sette farge på en rad i en ListBox om et kriterium er oppfyllt. Noen som kan hjelpe meg?

 

lstFakturaoversikt.Items(pos).Attributes.Add("style", color:green) fant jeg et sted på nett, men det var for ASP, mens jeg trenger for Windows Forms.

 

Prøvde å endre den til:

lstFakturaoversikt.Items(pos).Attributes.Add(Color.Green)

noe den ikke ville godta.

Lenke til kommentar
Videoannonse
Annonse

Du kan lage en ny draw event, og tegne det selv

eksempel:

private struct ListBoxItem
 {
 	private Color m_foreColor;
 	string m_text;
 	// Du kan sette inn flere egenskaper her, som brush, font etc.
 	public ListBoxItem(Color forecolor, string text)
 	{
   m_foreColor = forecolor;
   m_text = text;
 	}
 	public override string ToString()
 	{
   return m_text;
 	}
 	public Color ForeColor
 	{
   get { return m_foreColor; }
   set { m_foreColor = value;}
 	}
 	public string Text
 	{
   get { return m_text; }
   set { m_text = value;}
 	}

 }
 private void new_list_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
 {
 	if(((ListBox)sender).Items[e.Index].GetType() == typeof(ListBoxItem))
 	{
   // Type casting, så vi får de egenskapene vi vil ha
   ListBoxItem i = (ListBoxItem)((ListBox)sender).Items[e.Index];
   e.DrawBackground();
   // Sjekk om dette er den valgte i listen
   if((e.State & DrawItemState.Selected) == DrawItemState.Selected)
   {
   	// Dette er den valgte, tegn med Highlight
   	e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
   	e.Graphics.DrawString(i.ToString(), ((ListBox)sender).Font, SystemBrushes.HighlightText, e.Bounds);
   }
   else
   {
   	// Dette er ikke den valgte, tegn vanlig (med farger)
   	e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds);
   	e.Graphics.DrawString(i.ToString(), ((ListBox)sender).Font, new SolidBrush(i.ForeColor), e.Bounds);
   }
 	}
 }

 

For at dette skal fungere, setter du listboxen sin DrawMode egenskap til OwnerDrawFixed, og DrawItem event til new_list_DrawItem, deretter legger du inn verdier ved å bruker

[listbox].Items.Add(new ListBoxItem(...))

denne koden burde være så enkel at den kan skrives om til VB.NET hvis du bruker det.

Lenke til kommentar

Jeg har knotet dette fram i en indre klasse:

 

Private Class ListBoxItem

       Dim m_foreColor As Color
       Dim m_text As String
       'Du kan sette inn flere egenskaper her, som brush, font etc.

       Public Function ListBoxItem()
           m_foreColor = ForeColor
           m_text = Text
       End Function

       Public Overrides Function ToString() As String
           Return m_text
       End Function

       Public Property ForeColor() As Color
           Get
               Return m_foreColor
           End Get
           Set(ByVal Value As Color)
               m_foreColor = Value
           End Set
       End Property

       Public Property Text() As String
           Get
               Return m_text
           End Get
           Set(ByVal Value As String)
               m_text = Value
           End Set
       End Property

       Public Sub new_list_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs)
           Dim i As ListBoxItem
           'Type casting, så vi får de egenskapene vi vil ha
           i = sender.Items(e.Index)
           e.DrawBackground()
           'Sjekk om dette er den valgte i listen
           If ((e.State & DrawItemState.Selected) = DrawItemState.Selected) Then
               'Dette er den valgte, tegn med Highlight
               e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds)
               'e.Graphics.DrawString(i.ToString(), sender.Font, SystemBrushes.HighlightText, e.Bounds)
               e.Graphics.DrawString(i.ToString(), ((ListBox)sender).Font, SystemBrushes.HighlightText, e.Bounds)
           Else
               'Dette er ikke den valgte, tegn vanlig (med farger)
               e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds)
               e.Graphics.DrawString(i.ToString(), ((ListBox)sender).Font, new SolidBrush(i.ForeColor), e.Bounds)
           End If
       End Sub

   End Class

 

 

Han klager nå kun på denne linjen inni både If og Else:

e.Graphics.DrawString(i.ToString(), ((ListBox)sender).Font, new SolidBrush(i.ForeColor), e.Bounds)

 

Ser koden ellers "grei" ut i forhold til VB.Net?

Jeg er ikke så inne i hva som må til for å få det korrekt i forhold til hva som skal gjøres etter boka.

 

Jeg har endret DrawMode til listboxen, men hvordan setter/endrer jeg DrawItem til new_list_DrawItem ?

Endret av CeLiCiUm
Lenke til kommentar

Dette ble løsningen min etter litt ideer fra den koden du ga meg og noe jeg fant på nett etter en del leting:

 

 

Private Sub listBox1_DrawItem(ByVal sender As System.Object, _
   ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles lstFakturaoversikt.DrawItem
       lstFakturaoversikt.DrawMode = DrawMode.OwnerDrawFixed
       e.DrawBackground()
       Dim myBrush As Brush
       Dim str As String = ""

       str = lstFakturaoversikt.Items.Item(e.Index)

       If str.Substring(str.Length() - 3, 3).Trim.Equals("Ja") Then
           myBrush = Brushes.Black
       Else
           myBrush = Brushes.Red
       End If

       e.Graphics.DrawString(lstFakturaoversikt.Items(e.Index), e.Font, myBrush, New RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height))
       e.DrawFocusRectangle()
   End Sub

 

 

Takker for hjelpen. :yes:

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...