variable (string) aus andererform laden

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Picco.

    variable (string) aus andererform laden

    hallo alle zusammen,
    ich möchte gerne eine listbox Zeile je nach art des ergebnisses unterschiedlich einfärben.
    Aber es ändert sich immer die komplette Hintergrundfarbe aller Einträge und nicht nur die des einen.
    was muss ich tun um immer nur eine Zeile einzufärben und die anderen Zeilen in ihrer bisherigen Farbe zu belassen? Ich kenn mich damit nicht aus wenn das mit der Schriftfarbe einfacher geht nehme ich auch das ^^'

    VB.NET-Quellcode

    1. Dim g As Graphics = e.Graphics
    2. Dim f As New Font("Arial", 10, FontStyle.Regular)
    3. If Form1.dual.Checked Then
    4. erg = "(Du)"
    5. g.FillRectangle(Brushes.LightGreen, e.Bounds)
    6. g.DrawString(lstbxaus.Items(e.Index), f, Brushes.Black, e.Bounds.X, e.Bounds.Y)
    7. End If
    8. If Form1.dez.Checked Then
    9. erg = "(De)"
    10. g.FillRectangle(Brushes.LightBlue, e.Bounds)
    11. g.DrawString(lstbxaus.Items(e.Index), f, Brushes.Black, e.Bounds.X, e.Bounds.Y)
    12. End If
    13. If Form1.hex.Checked Then
    14. erg = "(He)"
    15. g.FillRectangle(Brushes.Red, e.Bounds)
    16. g.DrawString(lstbxaus.Items(e.Index), f, Brushes.Black, e.Bounds.X, e.Bounds.Y)
    17. End If
    18. If Form1.octa.Checked Then
    19. erg = "(Oc)"
    20. g.FillRectangle(Brushes.Yellow, e.Bounds)
    21. g.DrawString(lstbxaus.Items(e.Index), f, Brushes.Black, e.Bounds.X, e.Bounds.Y)
    22. End If
    also hier scheint wohl ein kleines Verständnis-Problem vorzuliegen

    1. als ich sagte ich kenne mich nicht so gut damit aus meinte ich ich kenne mich mit vb nicht so gut aus(bin ein vb noob und mache das nicht einmal freiwillig)

    2. ich habe 4 Möglichkeiten(also 4 unterschiedliche Farben) und weis nicht wie ich das beispiel von 2 auf 4 Farben erweitern soll. Das angezeigte Beispiel macht nichts anderes(wenn ich es verstehe) wie das:

    VB.NET-Quellcode

    1. If Alternate Then
    2. ' g.FillRectangle(Brushes.LightGreen, e.Bounds)
    3. Else
    4. ' g.FillRectangle(Brushes.Red, e.Bounds)
    5. End If
    6. g.DrawString(lstbxaus.Items(e.Index), f, Brushes.Black, e.Bounds.X, e.Bounds.Y)
    7. Alternate = Not Alternate


    und das hilft mir leider nicht zumal es da einen "onklick bug" gibt
    hallo pico,

    hier

    VB.NET-Quellcode

    1. If (e.State And DrawItemState.Selected) Then
    2. ' fill rectangle with highlight colou...r
    3. e.Graphics.FillRectangle(SystemBrushes.Highlight, rect)
    4. Else
    5. ' not selected, just fill normally...
    6. e.Graphics.FillRectangle(SystemBrushes.Window, rect)
    7. End If

    wird jenachdem ob der eintrag ausgewählt (selected) ist oder nicht die entsprechende hintergrundfarbe gefüllt.
    deine farbem kannst du ja jenachdem wie es sein soll entsprechend zeichnen

    z.b.

    VB.NET-Quellcode

    1. If (e.State And DrawItemState.Selected) Then
    2. If Form1.dual.Checked Then
    3. e.Graphics.FillRectangle(Brushes.LightGreen, rect)
    4. Else
    5. e.Graphics.FillRectangle(SystemBrushes.Highlight, rect)
    6. End If
    7. Else
    8. ' not selected, just fill normally...
    9. e.Graphics.FillRectangle(SystemBrushes.Window, rect)
    10. End If

    gruss

    mikeb69
    ;( das funkioniert nicht richtig. immer wenn ich ein ergebniss ein bzw ausgebe wird alles eingefärbt und nicht blos mitlaufend das eine ergebniss. sorry wenn ich mich da dumm anstelle aber ich blicks nicht

    VB.NET-Quellcode

    1. If (e.State And DrawItemState.Selected) Then


    was macht das z.B.? wenn ich das da lasse geht es gar nicht in die darin liegenden schleifen und wenn ich es auskommentiere färbt sich wieder alles
    hallo pico,

    also bei mir klappt das mit dem beispielcode von mad andy ganz gut !

    If (e.State And DrawItemState.Selected) Then

    was macht das z.B.?

    ich denke mal, dass das eine binäre und verknüpfung ist
    hier wird wohl der status des listbox items abgeprüft.

    wenn ich den debugger anhalte steht in
    e.state = 785 oder 768
    drawItem.state.selected = 1

    was als ergebnis eine 1 oder eine 0 zur folge hat
    entsprechend diesem ergebnis wird in den einen oder anderen zweig der if abfrage gesprungen.

    wenn ich nun

    VB.NET-Quellcode

    1. If (e.State And DrawItemState.Selected) Then
    2. If Me.dual.Checked Then
    3. e.Graphics.FillRectangle(Brushes.LightGreen, rect)
    4. Else
    5. e.Graphics.FillRectangle(SystemBrushes.Highlight, rect)
    6. End If
    7. Else
    8. ' not selected, just fill normally...
    9. e.Graphics.FillRectangle(SystemBrushes.Window, rect)
    10. End If

    schreibe wird das ausgewählte item grün hinterlegt

    gruss

    mikeb69

    mikeb69 schrieb:

    hallo pico,

    also bei mir klappt das mit dem beispielcode von mad andy ganz gut !


    If (e.State And DrawItemState.Selected) Then

    was macht das z.B.?

    ich denke mal, dass das eine binäre und verknüpfung ist
    hier wird wohl der status des listbox items abgeprüft.

    wenn ich den debugger anhalte steht in
    e.state = 785 oder 768
    drawItem.state.selected = 1

    was als ergebnis eine 1 oder eine 0 zur folge hat
    entsprechend diesem ergebnis wird in den einen oder anderen zweig der if abfrage gesprungen.

    wenn ich nun

    VB.NET-Quellcode

    1. If (e.State And DrawItemState.Selected) Then
    2. If Me.dual.Checked Then
    3. e.Graphics.FillRectangle(Brushes.LightGreen, rect)
    4. Else
    5. e.Graphics.FillRectangle(SystemBrushes.Highlight, rect)
    6. End If
    7. Else
    8. ' not selected, just fill normally...
    9. e.Graphics.FillRectangle(SystemBrushes.Window, rect)
    10. End If

    schreibe wird das ausgewählte item grün hinterlegt

    gruss

    mikeb69
    ja aber ich will doch garnicht das das ausgewählte eingefärbt wird ;( ich will das die 4unterschiedlichen arten von ausgaben ander farbit ginterlegt sind! hier mal ein mit paint gemaltes beispielbild:


    So soll das aussehen. Nicht so Bunt aber vom prinzp her(die daten sind alle falsch^^). jeder beitrag ne eigene arbe und wenn ich dann da noch einen dazu schreib rutschen die vorhandenen farben immer eins mit runter und der neue eintrag bekommt seine eigene(art entsprechende) farbe
    meinst du so? das geht nicht weil sich dann immer die farben für alle einträge ändern

    VB.NET-Quellcode

    1. If (e.State And DrawItemState.Selected) Then
    2. e.Graphics.FillRectangle(Brushes.LightSkyBlue, e.Bounds)
    3. Else
    4. If dual.Checked Then
    5. e.Graphics.FillRectangle(Brushes.Green, e.Bounds)
    6. End If
    7. If dez.Checked Then
    8. e.Graphics.FillRectangle(Brushes.Yellow, e.Bounds)
    9. End If
    10. If Hex.Checked Then
    11. e.Graphics.FillRectangle(Brushes.Lime, e.Bounds)
    12. End If
    13. If octa.Checked Then
    14. e.Graphics.FillRectangle(Brushes.Cyan, e.Bounds)
    15. End If
    16. End If
    17. g.DrawString(lstbxaus.Items(e.Index), f, Brushes.Black, e.Bounds.X, e.Bounds.Y)
    hallo pico,

    versuch mal das hier

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim test() As String = {"du", "de", "oc", "he"}
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Me.ListBox1.DrawMode = DrawMode.OwnerDrawFixed
    5. For i As Integer = 0 To 3
    6. Me.ListBox1.Items.Add("Eintrag " & test(i))
    7. Next
    8. End Sub
    9. Private Sub OnDrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles ListBox1.DrawItem
    10. Dim colourname As String
    11. ' need to have an Imports System.Drawing statement for this to work
    12. Dim rect As Rectangle = e.Bounds
    13. ' get the object we're dealing with...
    14. Dim myObj As Object = ListBox1.Items(e.Index)
    15. 'If (e.State And DrawItemState.Selected) Then
    16. ' fill rectangle with highlight colou...r
    17. 'e.Graphics.FillRectangle(SystemBrushes.Highlight, rect)
    18. 'Else
    19. ' not selected, just fill normally...
    20. 'e.Graphics.FillRectangle(SystemBrushes.Window, rect)
    21. 'End If
    22. If myObj.ToString.Contains("du") Then
    23. e.Graphics.FillRectangle(Brushes.Black, rect)
    24. End If
    25. If myObj.ToString.Contains("de") Then
    26. e.Graphics.FillRectangle(Brushes.Green, rect)
    27. End If
    28. If myObj.ToString.Contains("oc") Then
    29. e.Graphics.FillRectangle(Brushes.Blue, rect)
    30. End If
    31. If myObj.ToString.Contains("he") Then
    32. e.Graphics.FillRectangle(Brushes.Brown, rect)
    33. End If
    34. ' get the colour of the item to be drawn...
    35. colourname = "Red"
    36. ' build a brush of that colour
    37. Dim myBrush As New SolidBrush(Color.FromName(colourname))
    38. ' sort out our font - i.e. if it's an active item, make it bold...
    39. Dim myFont As Font
    40. myFont = New Font(e.Font, FontStyle.Bold)
    41. ' draw the text in the correct colour; this also assumes that the property you want to show is called 'name'...
    42. e.Graphics.DrawString(myObj, myFont, myBrush, rect.X + 4, rect.Y + 2)
    43. ' dispose of objects...
    44. myBrush.Dispose()
    45. myFont.Dispose()
    46. End Sub
    47. End Class

    einfach den code von mad andy's link ein bischen abändern und .... naja sieh selbst.

    gruss

    mikeb69