Edit Mode .Select Steuerung

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Edit Mode .Select Steuerung

    Hallo,

    ich habe eine DataGridView, die mit ein paar Zeilen befüllt ist. Einige der Zellen möchte ich im Edit Mode bearbeiten.

    Im Edit mode wird der Zellentext selektiert und der Textcursor an das Textende gestellt. Das ist das Standardverhalten einer DGV. (s. Anhang)

    Aus verschiedenen Gründen möchte ich aber diese Selektion vermeiden, also ein .Select(... , 0) absetzen.

    So habe ich das versucht:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. DataGridView1.Rows.Add("A", 1)
    4. DataGridView1.Rows.Add("Hugoline", 2)
    5. DataGridView1.Rows.Add("Barney", 3)
    6. DataGridView1.Rows.Add("", 4)
    7. End Sub
    8. Private Sub DgvDictionary_EditingControlShowing(sender As Object,
    9. e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    10. Dim myTextbox = DirectCast(sender, TextBox)
    11. myTextbox.Select(myTextbox.Text.Length, 0)
    12. End Sub
    13. End Class


    Das scheitert aber mit einer "Invalid Cast" Fehlermeldung zur Laufzeit.

    Wie komme ich denn an die virtuelle Textbox des EditMode im ControlShowing Event heran ?

    Ich hoffe, ich habe mein Problem verständlich machen können.

    LG
    Peter

    Anmerkung: Natürlich kann ich die Zeile ganz einfach noch einmal mit der Maus anklicken, dann wird die Selektion auch aufgehoben - und so wird das Problem umgangen. ich möchte das aber automatisiert machen!
    Bilder
    • s 2023-11-27 14-13-380.jpg

      19,26 kB, 796×483, 41 mal angesehen
    Der Parameter sender ist das Object das dieses Event Ausgelöst hat, also DataGridView1, was ein DataGridView ist. Ein DataGridView kann logischerweise nicht als TextBox gecastet werden. Schau dir mal an, was alles so in DataGridViewEditingControlShowingEventArgs drin steckt.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Das hilft ja schon mal ein ganzes Stück weiter, danke!

    Ich vermute, dass e.Control der Parameter ist mit dem man hier arbeiten muss. So hab ich das versucht:

    VB.NET-Quellcode

    1. Private Sub DgvDictionary_EditingControlShowing(sender As Object,
    2. e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    3. Dim myTextbox = DirectCast(e.Control, TextBox)
    4. Dim myText = myTextbox.Text
    5. myTextbox.Select(myTextbox.Text.Length, 0)
    6. End Sub


    Der Cast funktioniert damit ... und ich erhalte auch den Text der editierten Zelle.

    Allerdings klappt der .Select nicht ... das dürfte wohl daran liegen, dass "myTextbox" eine Kopie ist. Die Frage ist, wie ich jetzt an die orginäre Textbox herankomme ... das müsste doch irgend etwas wie e.Control. .... sein ?

    LG
    Peter


    VB.NET-Quellcode

    1. DirectCast(e.Control, TextBox).Select(0, 0)


    ist zwar syntaktisch ok, klappt aber leider auch nicht ...

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

    Siehe hier-> Partially select the text of a DataGridView cell when clicked

    VB.NET-Quellcode

    1. Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
    2. If TypeOf e.Control Is TextBox Then
    3. Dim tbec As TextBox = CType(e.Control, TextBox)
    4. BeginInvoke(New Action(Sub()
    5. tbec.SelectionStart = tbec.TextLength
    6. End Sub))
    7. End If
    8. End Sub
    Wow ... das hat auf Anhieb funktioniert ! Problem gelöst ... recht herzlichen Dank an die Ratgeber !

    Die Sache ist für meine Anwendung ein Segen ... weil ich fast regelmäßig vergessen habe, die Maus zu klicken und damit ständig den bestehenden Zelleninhalt unabsichtlich überschrieben habe! Das ist auf Dauer ganz schön nervig. :)

    Have a nice day!
    Peter