A
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);
}
}