Suche: Schnellerer Weg um die Position einer ListViewGroup zufinden



  • Ich zeichne eine Liste mit UserPaint und brauche dafür die Position der ListViewGroups im Moment finde ich die heraus indem ich die Position des Items unter der Überschrift herausfinde.Dieses Item indem ich alle Items der Gruppe durchgehe und ihre Y-Koordinate vergleiche.Das führt leider dazu das wenn viele Items in einer Gruppe sind das Scrollen ziemlich langsam wird.Weiss jemand einen schnelleren Weg um an die Position der ListViewGroup zukommen?

    p.s:

    listViewGroup.Items[0] funktioniert nicht da die Liste sortiert werden kann und dann das erste Item in der Gruppe nicht mehr oben ist.



  • Ich habe versucht das oberste Item der obersten Gruppe abzuspeichern und die Position dann von dort zuberechnen,aber die Gruppenüberschriften verschwinden wenn ich eine neue Gruppe hinzufüge.
    Hier der Code in OnPaint der für das Zeichnen der Gruppen zuständigt ist:

    //Groupdesign ist ein Dictonary das der Gruppe ein Design zuordnet
                   if (ShowGroups)
                    {
                        for (int j = 0; j < Groups.Count; j++)
                        {
                            ListViewGroup group = Groups[j];
                            CreateGroupDesign(group);
    //Berechnet die Grösse des Rechtecks und erstellt ein neues Design falls für die Gruppe keines Vorhanden ist.
                            if (GroupDesign[group].DisplayRectangle.Height > 0)
                            {
                                if (e.ClipRectangle.IntersectsWith(GroupDesign[group].DisplayRectangle))
                                {
                                    DrawGroup(GroupDesign[group], e.Graphics);//Zeichnet die Gruppe
                                }
                            }
                        }
                    }
    

    Hier ist DrawGroup:

    private void DrawGroup(VO_ListViewGroupDesign design, Graphics graphics)
            {
                graphics.FillRectangle( new SolidBrush(design.BackColor),design.DisplayRectangle);
                int line_width =0;
                switch(design.UnderlineMode)
                {
                    case VO_ListViewGroupDesign.Underlinemode_Enum.absolute:
                        line_width = design.UnderlineWidth;
                        break;
                    case VO_ListViewGroupDesign.Underlinemode_Enum.percent:
                        line_width = (int)((Width/100) * design.UnderlineWidth *1.5);
                        break;
                }       
                Pen pen = new Pen(new LinearGradientBrush(new Point(0,0),new Point(line_width,0),design.UnderlineColor, Color.Transparent), 2); 
                graphics.DrawLine(pen, new Point(design.DisplayRectangle.X, design.DisplayRectangle.Y + (design.DisplayRectangle.Height / 2)+10), new Point(design.DisplayRectangle.X + line_width, design.DisplayRectangle.Y + (design.DisplayRectangle.Height / 2)+10));
                StringFormat format = new StringFormat();
                format.Alignment = StringAlignment.Near;
                format.LineAlignment = StringAlignment.Far;
                format.Trimming = StringTrimming.Character;
    
                Rectangle text_rec = new Rectangle(design.DisplayRectangle.X + 5, design.DisplayRectangle.Y + (design.DisplayRectangle.Height / 2) + 8 -design.Font.Height, design.DisplayRectangle.Width, design.Font.Height);
                graphics.DrawString(design.Group.Header, design.Font, new SolidBrush(design.ForeColor), text_rec, format);
            }
    

    Und hier ist CreateGroupDesign:

    void CreateGroupDesign(ListViewGroup group)
            {
                if (!GroupDesign.ContainsKey(group))
                {
                    GroupDesign.Add(group, new VO_ListViewGroupDesign());
                    GroupDesign[group].Group = group;
                }
                int group_height = 50;
                int index = Groups.IndexOf(group);
                if (index == 0&&group.Items.Count > 0 &&group != top_group&&new_sorted)
                {
                    top_item_y = VO_ListViewGroupItemSorter.GetTopItem(group);
                    top_group = group;
                    new_sorted = false;
                }
                if (group.Items.Count > 0)
                {
    
                    int item_height = group.Items[0].Bounds.Height;
                    int y = top_item_y.Bounds.Y - group_height;
    
                    for (int i = 0; i < index; i++)
                    {
                        if (Groups[i].Items.Count > 0)
                        {
                            y += group_height;
                            y += (Groups[i].Items.Count * item_height);
                        }
                    }
                    GroupDesign[group].DisplayRectangle = new Rectangle(0, y, DisplayRectangle.Width,  group_height);
                }
            }
    

Anmelden zum Antworten