Autovervollständigen in einer Datagridview ermöglichen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Autovervollständigen in einer Datagridview ermöglichen

    Hallo!

    Wie kann ich ein Autovervollständigen in einer Datagridview ermöglichen?

    Am einfachsten wäre DataGridView1_CellTextChanged aufzurufen, um abzufragen, was gerade eingegeben wurde. Es soll das erste und zweite Zeichen ausgewertet und durch einen benutzerdefinierten Text, der zuvor in einem Textfeld eingegeben wurde ersetzt werden.

    Doch diese Funktion scheint es nicht zu geben. Gibt es eine Alternative?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Im dgv_EditingControlShowing muss man sich Zugriff auf das EditingControl verschaffen, und es auf Textbox casten.
    Dieser Textbox muss man dann AutoCompletion beibringen - ebenso, wie man es jeder anderen Textbox beibringen kann.
    Also am besten, du recherchierst erstmal, wie man einer normalen Textbox AutoCompletion beibringt.
    Irgenwie scheint es noch nicht richtig zu funktionieren und habe keine Ahnung warum.

    Die Funktion wird nur abgerufen, wenn ich das erste Zeichen eingebe, das seltsamer Weise eien Leerstring ausliest. Sobald das zweite Zeichen eingegeben wird, wird die Funktion nicht ausgeführt. Und bei Neueingabe wird der zuvoreingegebene Kompletttext ausgewertet.

    VB.NET-Quellcode

    1. ​Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    2. Dim Art As Char
    3. Dim Buchstabe As Char
    4. Dim Kette As String
    5. Dim Index As Integer
    6. Dim Betrag As Single
    7. Kette = e.Control.Text
    8. If SpaltenNummer = 2 Then
    9. If Len(Kette) >= 1 Then
    10. Art = Mid(Kette, 1, 1)
    11. End If
    12. If Len(Kette) >= 2 Then
    13. Buchstabe = Mid(Kette, 2, 1)
    14. End If
    15. Buchstabe = Großbuchstaben(Buchstabe)
    16. If Len(Kette) >= 2 Then
    17. Select Case Art
    18. Case "."
    19. Index = Asc(Buchstabe) - 64
    20. If Index >= 1 And Index <= 26 Then
    21. MyDataTable(ZeilenNummer)(2) = OptZweck(Index).Text
    22. Betrag = OptBetrag(Index).Value
    23. If Betrag < 0 Then
    24. MyDataTable(ZeilenNummer)(3) = Format(Betrag, "Currency")
    25. End If
    26. If Betrag > 0 Then
    27. MyDataTable(ZeilenNummer)(4) = Format(Betrag, "Currency")
    28. End If
    29. SaldenNeuBerechnen()
    30. End If
    31. End Select
    32. End If
    33. End If
    34. End Sub
    @Selter98 Lesen bildet:

    ErfinderDesRades schrieb:

    Also am besten, du recherchierst erstmal, wie man einer normalen Textbox AutoCompletion beibringt.
    Ansonsten wird der Rest vom Framework übernommen, Dein Code ist also obsolete.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Selter98 Darf ich davon ausgehen, dass Du das Autovervollständigen in einer TextBox bereits vollständig implementiert hast?
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    Selter98 schrieb:

    Wie geht das? Wo finde ich ein Beispiel?


    DirectCast oder CType sind dir bekannt? Auch das EditingControl vom DGV? Auch musst du wissen, das es verschiedene Typen gibt, also einen Test einbauen!
    In der DataGridView.EditingControlShowing Event-Sub

    VB.NET-Quellcode

    1. If dgv.CurrentCell.EditType = GetType(DataGridViewTextBoxEditingControl) Then
    2. Dim textBox As TextBox = 'hier das dgv.editingcontrol zu textbox casten
    3. End If

    Ich das Beispiel genommen und etwas herumprobiert, bis ich zu diesem Ergebnis kam:

    VB.NET-Quellcode

    1. ​If SpaltenNummer = 2 Then
    2. If DataGridView1.CurrentCell.EditType = GetType(DataGridViewTextBoxEditingControl) Then
    3. Dim tB As TextBox = TextBox1
    4. DataGridView1.Controls.Add(tB)
    5. End If
    6. End If


    Da allerdings weder eine Toxbox, noch ein Autovervollständigen zu sehen, war, versuchte ich es mit:

    VB.NET-Quellcode

    1. ​If SpaltenNummer = 2 Then
    2. y = DataGridView1.ScrollBars.Vertical.Value / DataGridView1.ScrollBars.Vertical.MAXValue * ZeilenNummer * DataGridView1.Columns(0).height
    3. x = DataGridView1.Left + DataGridView1.Columns(0).Width + DataGridView1.Columns(1).Width
    4. TextBox1.Left = x
    5. TextBox1.Top = y
    6. TextBox1.Width = DataGridView1.Columns(2).Width
    7. TextBox1.Visible = True
    8. End If


    Allerding kann hier keine Scrollbarposition ausgelesen werden, um heraus zu finden, welchen Top-Wert die aktuelle Zeile hat.
    Nein du musst das DataGridView.EditingControl zu einer TextBox casten.
    Dim tb as TextBox = DirectCast(IrgendeinDataGridView.<control_welches_ich_erwähnte>, <ZielTyp_des_controls>)

    mit dieser textBox arbeitest du dann weiter. Du brauchst kein Control hinzufügen, das welches du haben willst gibt es schon.
    @Selter98 Sieh Dir mal dieses Snippet an:

    VB.NET-Quellcode

    1. Private Sub DataGridView2_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView2.CellContentClick
    2. Dim ctrl = DirectCast(DataGridView2.EditingControl, DataGridViewTextBoxEditingControl)
    3. If ctrl IsNot Nothing AndAlso ctrl.TextLength > 4 Then
    4. ctrl.SelectionStart = 2
    5. ctrl.SelectionLength = 2
    6. ctrl.SelectedText = "bbb"
    7. End If
    8. End Sub
    Und gugst Du hier:
    ISPF Editor unter VB
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Private Sub DataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    2. Dim TB = DirectCast(e.Control, TextBox)
    3. TB.AutoCompleteCustomSource.AddRange({"Foo", "Bar", "Bazz"})
    4. TB.AutoCompleteMode = AutoCompleteMode.Suggest
    5. TB.AutoCompleteSource = AutoCompleteSource.CustomSource
    6. End Sub

    läuft
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.