Position von DataGridView-Cell soll Position meiner TextBox sein!

  • VB.NET

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

    Position von DataGridView-Cell soll Position meiner TextBox sein!

    Hallo!

    Kleines Problemchen..hoff ich!

    Ich möchte das ich bei einem klick auf den Header meines DataGridViews eine TextBox über der Header-Cell erscheint, wo ich dann den Namen der Spalte eintragen kann..
    ..OK, ich habs bisher so gemacht:

    Im Form-Shown-Event die TextBox dem DataGridView zugewiesen: dgvAdminTabelle.Controls.Add(tbDGV)
    Dann hab ich im ColumnHeaderMouseClick-Event folgenden Code:

    VB.NET-Quellcode

    1. Private Sub SetTextbox()
    2. tbDGV.Visible = True
    3. dgvAdminTabelle.ClearSelection()
    4. Dim R As Rectangle = dgv.GetColumnDisplayRectangle(index, True)
    5. tbDGV.Location = R.Location
    6. tbDGV.Size = New Size(R.Width, dgv.ColumnHeadersHeight)
    7. tbDGV.Text = dgv.Columns(index).HeaderText
    8. tbDGV.Focus()
    9. tbDGV.SelectAll()
    10. End Sub


    Das funzt eig. schon ganz gut!
    Eigentlich! Denn das/die Probleme die sich mir jetzt stellen sind
    1. Die TextBox akzeptiert keine "Enter" oder "Return" Taste!
    2. Wenn ich das DGV deaktiviere deaktiviert sich auch die TextBox!

    Dies fänd ich aber für die weitere Programmfunktionalität wichtig, weil ich
    A mit Enter/Return die Eingabe abschließen möchte
    und
    B des DGV während der TextBox-Eingabe sperren möchte/muss!

    Nun wollte ich einfach mit Controls.Add(tbDGV) die TextBox auf die Form legen, weil dann akzeptiert diese "Enter" & "Return" UND ich kann die DGV unabhängig von der TB deaktivieren!
    Leider bekomm ichs ums verrecken nicht hin die richtige Position für die TextBox auszuklüngeln..weil des DGV liegt in einem TabControl und in einer GroupBox..
    ..hab versucht diese mit inn die Position einzurechnen, selbst des "ToolWindowCaptionHeight" hab ich mit drinne..passt aber immer iwie nich..

    VB.NET-Quellcode

    1. Dim _location As Point = New Point(dgv.GetColumnDisplayRectangle(index, True).X + dgv.Location.X + GroupPanel2.Location.X,
    2. dgv.GetColumnDisplayRectangle(index, True).Y + dgv.Location.Y + GroupPanel2.Location.Y + TabControl1.Location.Y + SystemInformation.ToolWindowCaptionHeight)
    3. Dim R As Rectangle = New Rectangle(_location, dgv.GetColumnDisplayRectangle(index, True).Size)


    Gibts da irgend ne vorgezimmerte Formel vonwegen Child-Parent-Controls usw. oder wie bekomme ich die Position der HeaderCell?
    Wegen dem Enter musst du beim erstellen der Textbox das KeyDown Event der selbigen abonnieren und dort dann dein Enter behandeln
    "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

    Morrison schrieb:

    Wenn ich das DGV deaktiviere deaktiviert sich auch die TextBox!
    Das sollte eher der Auftakt für ein UserControl sein. Denn wenn die TB Teil der DGV-Controls ist, bedeutet DGV-Deaktivierung (= Enabled = False?) auch TB-Deaktivierung.

    Bzgl. Position: Gehe per Do-Schleife die Parents des DGVs durch und addiere deren Left-PropertyValues + DGV-Left. Dann noch Rahmen und Summe der vorhergehenden ColumnWidths dazu, dann sollte sich die X-Position der TB gut ergeben. Genauso mit y. Nur ohne Beachtung der Columns.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ja, EDR hatte Recht:

    VB.NET-Quellcode

    1. Private Sub placeControl(ByVal dgv As DataGridView, ByVal ctl As TextBox, ByVal index As Integer)
    2. ctl.Location = PointToClient(dgv.PointToScreen(dgv.GetColumnDisplayRectangle(index, True).Location))
    3. ctl.Size = New Size(dgv.GetColumnDisplayRectangle(index, True).Width, dgv.ColumnHeadersHeight)
    4. ctl.Text = dgv.Columns(index).HeaderText
    5. End Sub