Bestimmten Text in einer Zelle im DataGridView markieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Michl.

    Bestimmten Text in einer Zelle im DataGridView markieren

    Hallo zusammen,

    Ich würde gerne beim edieren eines Textes im DataGridView einen bestimmeten Teil des Textes markieren und kieg das nicht gebacken. In einer TextBox ist das mit "SelectionLength" ja wunderbar realisierbar.

    Ich habe in der Zelle Dateinamen (Dateiname.ext) stehen, die manuell durch "Add" eingefügt wurden.

    Wenn ich die Zelle zum bearbeiten anklicke ist ja standardmäßig der komplette Text markiert.

    Ich habe bisher erfolglos versucht diesen in "...CellBeginEdit" so zu markieren, dass nur der Dateiname (ohne die Extension) Blau markiert ist.

    Könnt ihr mir da weiterhelfen?

    Michl schrieb:

    Könnt ihr mir da weiterhelfen?

    Versuche es einmal, wie folgt...

    VB.NET-Quellcode

    1. Private Sub DGV_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
    2. Dim dgv = DirectCast(sender, DataGridView)
    3. Dim cell = dgv.CurrentCell : If cell Is Nothing Then Return
    4. If cell.OwningColumn.GetType <> GetType(DataGridViewTextBoxColumn) Then Return
    5. Dim tbx = DirectCast(dgv.EditingControl, TextBox)
    6. If tbx IsNot Nothing Then
    7. tbx.SelectionStart = 0
    8. tbx.SelectionLength = 5
    9. End If
    10. End Sub
    Hallo VB1963,

    erstmal Danke für die schnelle Hilfe!

    Der Versuch ist leider in Zeile 6 gescheitert. tbx = "Nothing" und der Text ist erstmal noch komplett markiert.
    Wenn ich danach aber nochmal den blau markierten Test klicke, sind die ersten 5 Zeichen, wie erwartet markiert.

    Hast du eine Idee, an was das liegen könnte?

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

    Hi,
    ich hab das jetzt zwar so hinbekommen:

    VB.NET-Quellcode

    1. Public Delegate Sub Editor(sender As Object)
    2. Private Sub DataGridView1_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
    3. Dim t As New Thread(New ThreadStart(Sub()
    4. Thread.Sleep(2)
    5. Me.Invoke(New Editor(AddressOf Work), sender)
    6. End Sub))
    7. t.Start()
    8. End Sub
    9. Private Sub Work(sender As Object)
    10. Dim dgv = DirectCast(sender, DataGridView)
    11. Dim cell = dgv.CurrentCell : If cell Is Nothing Then Return
    12. If cell.OwningColumn.GetType <> GetType(DataGridViewTextBoxColumn) Then Return
    13. Dim tbx = DirectCast(dgv.EditingControl, TextBox)
    14. If tbx IsNot Nothing Then
    15. tbx.SelectionStart = 0
    16. tbx.SelectionLength = 5
    17. End If
    18. End Sub


    Aber die feine englische Art ist das nicht. Es liegt nicht an @VB1963's Code, sondern daran, dass erst das Event gefeuert wird und dann das Control gesetzt wird...
    Wenn einer ne bessere Lösung weiß, hab ich nix dagegen. :D

    LG
    Twometer
    PS: Ich habe die EditMode auf EditOnKeystrokeOrF2, geht bei mir mit deinem Originalcode auch nich
    An Error 404 occurred while loading signature...
    Hallo,

    Wie bereits geschrieben, in dem Moment in dem ich das erste mal in die Zelle klicke ist der komplette Text zur Bearbeitung Blau markiert. Erst bei nochmaligem klick in den komplett markierten Text werden die ersten 5 Zeichen markiert.

    Der EditMode steht auf "EditOnKeystrokeOrF2"
    Imports System.Threading am Anfang in den Code...





    //EDIT: Das ganze geht auch einfacher:

    VB.NET-Quellcode

    1. Dim t As New Thread(New ThreadStart(Sub()
    2. Thread.Sleep(2)
    3. Me.Invoke(Sub()
    4. Dim dgv = DirectCast(sender, DataGridView)
    5. Dim cell = dgv.CurrentCell : If cell Is Nothing Then Return
    6. If cell.OwningColumn.GetType <> GetType(DataGridViewTextBoxColumn) Then Return
    7. Dim tbx = DirectCast(dgv.EditingControl, TextBox)
    8. If tbx IsNot Nothing Then
    9. tbx.SelectionStart = 0
    10. tbx.SelectionLength = 5
    11. End If
    12. End Sub)
    13. End Sub))
    14. t.Start()

    An Error 404 occurred while loading signature...
    Hi,
    Aber es muss ja auch funktionieren, wenn das DGV mal nicht den Fokus hat oder?
    Aber es muss doch eigentlich einfacher gehen, als das mit einem Thread zu überbrücken, oder im Programm den Fokus zu setzen... Das kann eigentlich nicht sein...
    LG
    Twometer
    An Error 404 occurred while loading signature...
    Hallo nochmal,
    Wenn ich den Code von VB1963 verwende und die Edit-Eigenschaft auf EditOnEnter setze funktioniert das auch.
    Aber beim Anklicken sieht man ganz deutlich dass zuerst der komplette Text markiert ist und danach sofort der im Code angegebene Bereich markiert wird.
    ich denke, es (was immer genau damit gemeint ist) geht im DGV_EditingControlShowing - Event.

    Auf jeden Fall gibts da nix einfaches. Es ist numal so, dass DGV, wenns in den EditModus geht ein EditingControl erzeugt, und in TextboxColumns ist das ein TextboxEditinControl, in ComboboxColumns ein ComboboxEditingControl, in CheckboxColumns ein....

    Und nur während des EditModus kann man dieses Control überhaupt zugreifen.

    (Edit: ups viel überschnitten)
    Jo, der Standard beim TextboxEditingControl ist wohl FullSelected, und kann schon sein, dass man das immer auch kurz sehen kann.

    Wenn das gar zu schlimm ist, dann wird man wohl eine eigene DGV-Column programmieren müssen - viel Spass dabei!
    Hallo Leuts,

    alles gut :thumbsup:

    Wen das ggf. stört, dass für einen ganz kurzen Zeitraum zuerst der komplette Text markiert ist. Kann ja die andere Lösung verwenden. Es funktinonieren beide Varianten.

    In jedem Fall nochmal ein großes Danke an alle Beteiligten für die Lösung(en) meines Problems.

    Viele Grüße aus der Pfalz, Michl
    Dann hilft der Mini-Delay:

    VB.NET-Quellcode

    1. Private Sub DGV_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DGV.EditingControlShowing
    2. Dim tb = DirectCast(DGV.EditingControl, DataGridViewTextBoxEditingControl)
    3. Me.BeginInvoke(Sub() tb.Select(1, 1))
    4. End Sub