Laden...

HitTest in ListView ergibt falsche Position

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 230 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
HitTest in ListView ergibt falsche Position

Hallo allerseits,
ich möchte in einem ListView einzelne Zellen editieren. Dazu lege ich eine TextBox über die entsprechende Zelle, editiere diese und kopiere das Ergebnis in das SubItem. Mit einem Code von Codezentrale "Editieren von ListView Subitems mittels TextBox" funktioniert das auch prinzipiell. Allerdings erscheint die TextBox nicht über der zu editierenden Zelle, sondern 45 Pixel zu tief und 2 Pixel zu weit rechts. Hier ist die entsprechende Stelle:


        // Event des ListViews
        // zum Merken des zuletzt angeklickten ListViewItems
        private void ListViewRGB_MouseUp(object sender, MouseEventArgs e)
        {
            ListViewHitTestInfo htInfo = ListViewRGB.HitTest(e.X, e.Y);
            if (htInfo != null)
            {
                if (htInfo.Item != null && htInfo.SubItem != null)
                {
                    _lvSubItemEdit = htInfo.SubItem;
                }
            }
        }

        // bei Doppelklick auf ein SubItem die Textbox anzeigen
        private void ListViewRGB_DoubleClick(object sender, EventArgs e)
        {
            // Größe anpassen
            _tbEdit.Top = ListViewRGB.Top - 45 + _lvSubItemEdit.Bounds.Top + 2;
            _tbEdit.Left = ListViewRGB.Left -2 + _lvSubItemEdit.Bounds.Left + 2;
            _tbEdit.Width = _lvSubItemEdit.Bounds.Width;
            _tbEdit.Height = _lvSubItemEdit.Bounds.Height;
            // Inhalt übergeben
            _tbEdit.Text = _lvSubItemEdit.Text;
            // anzeigen
            _tbEdit.Visible = true;
            _tbEdit.BringToFront();
            _tbEdit.Focus();
        }


ListViewRGB ist meine Listbox. _tbEdit ist die Textbox.
Ich habe schon -45 und -2 als Korrektur eingefügt, aber das kann es ja nicht wirklich sein.
Wo ist mein Fehler? Hat jemand eine Idee?

Karl Stanger
4.939 Beiträge seit 2008
vor einem Jahr

Wer ist denn der Parent vom _tbEdit?
Und sitzt die ListViewRGB direkt auf der Form oder hast du evtl. noch ein Panel o.ä. als Parent davon?

Das beste ist, du benutzt das ListViewRGB als Parent vom _tbEdit - dann brauchst du nur relativ davon die Position berechnen.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Ich denke, dass ich _tbEdit an ListViewRGB angehängt habe.


ListViewRGB.Controls.Add(_tbEdit);

ListViewRGB ist in einer GroupBox und es gibt noch ein Label mit der Überschrift oberhalb von ListViewRGB.

Habe jetzt gerade festgestellt: wenn ich ListViewRGB innerhalb der GroupBox verschiebe, ändert sich auch der Offset...

Karl Stanger
4.939 Beiträge seit 2008
vor einem Jahr

Wenn es schon direkt der ListViewRGB untergeordnet ist, dann brauchst du dessen Position (ListViewRGB.Top, ListViewRGB.Left) nicht mehr (und diese sind wohl (45, 2)...):


_tbEdit.Top = _lvSubItemEdit.Bounds.Top + 2;
_tbEdit.Left = _lvSubItemEdit.Bounds.Left + 2;

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Es funktioniert jetzt und ist nicht mehr abhängig von der Position der ListView. Allerdings muss ich immer noch eine Positions-Korrektur machen.


           _tbEdit.Top = _lvSubItemEdit.Bounds.Top + 2;
           _tbEdit.Left = _lvSubItemEdit.Bounds.Left + 6;


Die könnte noch von irgendwelchen Paddings und Margins herkommen.

Danke für deine Hilfe!

Karl Stanger