DataGridView suchen und markieren

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    DataGridView suchen und markieren

    Hi,

    ich denke Ihr habt das Thema schon sehr oft behandelt. Leider hat keine der gefundenen Lösungen den Erfolg gebracht. Woran das genau liegt, weiß ich leider nicht.

    Ich möchte in einer DataGridView einen Text oder eine Zahl suchen die in einer TextBox steht, wenn es einen Treffer gab, soll dieser in der DGV markiert werden. Gibt es mehrere Treffer soll er trotzdem markiert werden und zusätzlich eine Textbox erscheinen, die auf den nächsten Treffer hinweist. Alle Lösungen haben nicht funktioniert, oder ich stelle mich echt zu doof an.


    Könnt ihr mir da etwas weiterhelfen?
    Google ist mittlerweile auch schon müde und liefert mir keine Lösung...

    Danke erstmal :)
    Ein, wie ich finde, elegante wie auch praktikable Möglichkeit ist es , eine RichTexBox zu verwenden.
    codeproject.com/Articles/31823…ox-Cell-in-a-DataGridView

    VB1963 schrieb:

    Was verstehst du unter markieren? Farbliche zeilenweise Hervorhebung im DGV oder dass die betroffenen Zeilen zusammengefasst herausgefiltert werden?
    Stichwort Bindingsource verwenden, wenn du ein datengebundenes DGV verwendest...



    Ich würde die gefundene Zeile gerne im DataGridView markieren damit mir die Textbox die gebunden sind dann die Werte der Zeile anzeigen.

    Mit dem Link von Dir FormFollowsFunction komme ich leider nicht so zurecht. Vielleicht hilft ja meine Anmerkung dass ich die Zeile markieren möchte um den gebundenen Textboxen die Werte anzeigen zu lassen. Danke aber trotzdem schon Mal :)
    @Sub7evenHH Wenn ich Dich recht verstehe, soll der String, der in einer TextBox steht, in allen Zellen / in allen Zellen einer oder mehrerer Spalten eines DataGridView gesucht werden und bei einem Treffer die betreffende Zeile markiert werden.
    Die Suche wird nach einem Treffer ja|nein fortgesetzt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Jaaa, genau. Es soll der String aus der Textbox in der gesamten Datagrid gesucht werden und die entsprechende Zeile dann markiert werden. Dann schalten die anderen gebundenen Textboxen auf der Wert der markierten Zeile. Sollten dann weitere Treffer gefunden worden sein, soll man gefragt werden ob der nächste Eintrag markiert werden soll.
    @Sub7evenHH Wie kommen denn Deine Daten in das DGV?
    Manuell oder DataBinding?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Sub7evenHH Probier mal dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private dt As DataTable
    3. Private Sub Form1_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
    4. Me.dt = New DataTable("Test") ' Tabelle anlegen
    5. Me.dt.Columns.Add(New DataColumn("Spalte 1", GetType(String)))
    6. Me.dt.Columns.Add(New DataColumn("Spalte 2", GetType(String)))
    7. Me.dt.Columns.Add(New DataColumn("Spalte 3", GetType(String)))
    8. Me.DataGridView1.DataSource = Me.dt
    9. End Sub
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    11. Dim txt = Me.TextBox1.Text
    12. For i = 0 To Me.dt.Rows.Count - 1 ' Schleife über alle Zeilen
    13. Dim row = Me.dt.Rows(i)
    14. For j = 0 To Me.dt.Columns.Count - 1 ' Schleife über alle Spalten
    15. Dim xx = row.ItemArray(j) ' Zelle abfragen
    16. If xx.ToString() = txt Then
    17. Me.DataGridView1.CurrentCell = Me.DataGridView1(i, j) ' Zelle markieren
    18. MessageBox.Show(String.Format("{0} - {1}", i, j))
    19. End If
    20. Next
    21. Next
    22. End Sub
    23. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Danke für deine Mühe. Ich bekomme es leider aber trotzdem noch nicht so hin. Ich werde wohl erstmal ein bisschen mehr üben und mich dann später mit dem Problem befassen. Vielen Dank für deine Zeit :)

    Vollzitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Sub7evenHH schrieb:

    Ich bekomme es leider aber trotzdem noch nicht so hin.
    Wo klemmt es?
    Was geht nicht?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ungetestet

    Freundliche Grüsse

    exc-jdbi
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form1
    4. Private ds As DataSet
    5. Private rand As New Random
    6. Private bs As BindingSource
    7. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    8. Me.TextBox1.Text = "Stefanie" 'Müller
    9. Me.bs = New BindingSource(ds, "Person")
    10. Me.DataGridView1.DataSource = bs
    11. End Sub
    12. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    13. Me.DataGridView1.ClearSelection()
    14. For r As Integer = 0 To Me.DataGridView1.RowCount - 2
    15. Dim cm As CurrencyManager = DirectCast(Me.DataGridView1.BindingContext( _
    16. Me.DataGridView1.DataSource, _
    17. Me.DataGridView1.DataMember), _
    18. CurrencyManager)
    19. Dim rv As DataRowView = TryCast(cm.List(r), DataRowView)
    20. Dim dr As DataRow = rv.Row()
    21. For c As Int32 = 0 To dr.ItemArray.Length - 1
    22. If dr.Item(c).ToString.Trim.SequenceEqual(Me.TextBox1.Text.Trim) Then
    23. Me.DataGridView1.Rows(r).Cells(c).Selected = True
    24. End If
    25. Next
    26. Next
    27. End Sub
    28. Private Sub InitializeDataset()
    29. ds = New DataSet("Persons")
    30. Dim dt = New DataTable("Person")
    31. Dim fname = {"Herbert", "Stefanie", "Theodor", "Klaus", "Sahra", "Olga", "Stefanie"}
    32. Dim lname = {"Kegel", "Schneider", "Fischer", "Müller", "Weber", "Becker", "Müller"}
    33. With dt.Columns
    34. .Add(New DataColumn("Vornamen", GetType(String)))
    35. .Add(New DataColumn("Nachnamen", GetType(String)))
    36. .Add(New DataColumn("Alter", GetType(Integer)))
    37. For i As Integer = 0 To fname.Length - 1
    38. Dim dr As DataRow = dt.NewRow()
    39. dr("Vornamen") = fname(i)
    40. dr("Nachnamen") = lname(i)
    41. dr("Alter") = rand.Next(15, 45)
    42. dt.Rows.Add(dr)
    43. Next
    44. End With
    45. Me.ds.Tables.Add(dt)
    46. End Sub
    47. Public Sub New()
    48. MyBase.new()
    49. Me.InitializeComponent()
    50. Me.InitializeDataset()
    51. End Sub
    52. End Class