Autor Beitrag
chip777
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 03.05.10 08:34 
Hi,

ich bins mal wieder :-)

Ich hab ein Panel namens Panel2 und würde darin gerne eine PictureBox erstellen, ich hab mir die PictureBox Klasse in der MSDN angeschaut, aber leider zeichnet mein Programm nichts -.-
Es soll kein Bild geladen werden, sondern lediglich ein grünes Rechteck mit variabler Höhe und Breite erzeugt werden.

Gruß

Martin
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 03.05.10 08:41 
Hallo Martin,

wenn du die MSDN durchgelesen hast, weißt du, dass die PictureBox dafür nicht gedacht ist:
Zitat:
Typically the PictureBox is used to display graphics from a bitmap, metafile, icon, JPEG, GIF, or PNG file.

Sie ist der Container für ein Bild.

Warum nimmst du nicht einfach ein Panel oder Label?

Jürgen
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 03.05.10 08:48 
Hallo Jürgen,

Wenn das geht, würde ich auch etwas anderes nehmen, Label hab ich bis jetzt nur für Text genutzt und noch nicht für Bilder, Panel hab ich meistens nur zum gruppieren von Elementen genutzt.

Welche der Möglichkeiten würdest du mir empfehlen?

Und wie kann ich das Objekt im Panel2 definieren, sodass die Position des Objektes relativ zu meinem Panel ist.

Ich versuch nochmal zu erklären was genau ich erreichen möchte:
Ich habe einen SplitContainer, im Panel 1 befindet sich ein TreeView, Panel 2 ist im Moment leer, dort möchte ich jetzt Balken erzeugen auf der Höhe jedes TreeView Elements, diese Balken sollen später durch ihre Länge Prozesszeiten darstellen.

edit: das Panel konnte ich erstellen, das klappt schon, jetzt wollte ich das ganze in eine foreach-Schleife packen um den TreeView durchzugehen, allerdings weiß ich nicht wie ich an die Position der einzelnen Nodes komme, um das Panel in der richtigen Höhe darzustellen.

Hier mal der Code den ich bis jetzt habe:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
            foreach (TreeNode node in treeView1.Nodes)
            {
                int positionY = 0;
                int hoehe = 0;
                // positionY = node.                           // Hier würde ich jetzt gerne die Position der node ermitteln
                Panel panel = new Panel();
                panel.Location = new Point(5672);            // Die Werte haben keine Bedeutung sondern dienen nur zum Test
                panel.Size = new Size(264152);
                panel.BackColor = Color.Green;
                splitContainer1.Panel2.Controls.Add(panel);


Zuletzt bearbeitet von chip777 am Mo 03.05.10 09:30, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 03.05.10 09:26 
Für solche Balken scheint mir das Label wirklich am einfachsten zu sein. Du musst doch nur AutoSize auf false setzen, BackColor festlegen und Width nach deinen Werten berechnen. Vielleicht klappt es auch, Top direkt aus dem TreeView zu übernehmen.

Ich vermute auch, dass ein Label das System erheblich weniger belastet als jeder Zeichen-Vorgang.

Jürgen
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 03.05.10 09:34 
Kann ich für die Positionsbestimmung den Node Index nutzen?
Die Nodes müsste ja alles gleich hoch sein, darüber müsste ich dann eigentlich die Position meines Labels festlegen können. Ich werd es einfach mal versuchen.

Edit: Das mit dem Index funktioniert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
foreach (TreeNode node in nodes)
            {
                int positionY = 0;
                positionY = (node.Index*20);
                Label label = new Label();
                label.Location = new Point(10, positionY);
                label.Size = new Size(30,16);
                label.BackColor = Color.Green;
                splitContainer1.Panel2.Controls.Add(label);
                ErstellenDiagramm(node.Nodes);
            }

Jetzt muss ich nur noch herausbekommen, wie hoch der Text im TreeView ist, damit ich die Balken anpassen kann, damit diese genau synchron sind.

Edit2: wie kann ich mein label2 indem sich die Balken befinden scrolbar machen? Und wie bekomm ich es hin das dieses Panel synchron zum panel1 scrollt, indem sich das TreeView befindet.

Außerdem würde ich gerne überprüfen ob die jeweilige Node sichtbar ist oder nicht, um nur die expandierten Knoten als Balken darzustellen.


Zuletzt bearbeitet von chip777 am Mo 03.05.10 10:11, insgesamt 1-mal bearbeitet
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 03.05.10 09:59 
Ändere deinen letzten Beitrag bitte. Ich habe den starken Verdacht, dass du dauernd Panel und Label verwechselst. Das Panel sollte der Container für die Labels sein, nicht umgekehrt.

Statt das Panel scrollbar zu machen, scheint mir ein automatischer Zoom sinnvoller zu sein: Bei jedem Balken wird im Tag der tatsächliche Wert eingetragen. Im Resize-Ereignis des Panels werden die Breiten der Balken neu berechnet aus Panel.Width und Balken.Tag, sodass die Proportionalität passt.

Wie ein Panel ScrollBars erhalten kann, finde ich im Moment nicht. (Das sollte es doch eigentlich geben, oder?) Vielleicht musst du dafür unter CodeProject suchen.

Gruß Jürgen

PS. Zu den "expandierten Knoten" kann ich nichts sagen.
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 03.05.10 10:16 
Ich hab den Beitrag oben mal geändert, du hattest Recht, ich hab da Panel und Label im Text immermal vertauscht.

Hier jetzt der Quellcode, mit richtig angepasster Höhe, d.h. die Balkenposition passt zur TreeView Position.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
foreach (TreeNode node in nodes)
            {
                //if (node.Parent.IsExpanded)
                {
                    int positionY = 0;
                    positionY = ((int)node.Tag * 16);
                    Label label = new Label();
                    label.Location = new Point(10, positionY);
                    label.Size = new Size(3015);
                    label.BackColor = Color.Green;
                    splitContainer1.Panel2.Controls.Add(label);
                    ErstellenDiagramm(node.Nodes);
                }
            }

edit: Ich hab mal node.Tag anstelle von Index verwendet, weil Index bei Subnodes neu beginnt. node.Tag ist durchgehen nummeriert.

Das mit dem sichtbar will ich über node.Parent.IsExpanded versuchen, allerdings gibt es da eine Fehlermeldung da der erste Knoten keinen Parent hat.

Es muss scrollbar sein, damit die Balken zum TreeView passen, dass kann ich leider nicht umgehen, ich werde mal auf der von dir geposteten Seite suchen, ob ich etwas finde.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mo 03.05.10 10:27 
Sollte das nicht einfach mit einer Erweiterung der if-Abfrage gehen?
ausblenden C#-Quelltext
1:
if (node.Parent != null && node.Parent.IsExpanded)					

Jürgen
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 03.05.10 10:46 
Danke, ich wollte das schon wieder viel zu kompliziert machen, mit der If Abfrage funktioniert es super.
Allerdings hat das mit der ID nicht geklappt, also hab ich den Code nochmals geändert. Jetzt sollte es so klappen, das es alle sichtbaren Knoten als Balken darstellt. Nur das mit dem scrollen hab ich noch nicht gelöst.
Hier nochmal der Code falls jmd anderes sowas auch mal braucht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
{
            int anzahlBalken = 0;
            foreach (TreeNode node in nodes)
            {
                if (node.Parent != null && node.IsVisible)
                {
                    anzahlBalken++;
                    int positionY = 0;
                    positionY = anzahlBalken * 16;
                    Label label = new Label();
                    label.Location = new Point(10, positionY);
                    label.Size = new Size(3015);
                    label.BackColor = Color.Green;
                    splitContainer1.Panel2.Controls.Add(label);
                }
                ErstellenDiagramm(node.Nodes);
            } 
}
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 03.05.10 11:10 
Das Ausgeben der Balken funktioniert jetzt. Das einzige Problem, was es jetzt noch zu lösen gilt, ist die Synchronisation zwischen den beiden Panels. Mein TreeView besitzt automatisch eine Bildlaufleiste und ebenso mein panel2 indem sich mein Balkendiagramm befindet. Wie kann ich jetzt den Scrollbalken im panel2 ausblenden und die Steuerung von diesem einfach über den Scrollbalken vom treeView laufen lassen. Sodass ich für beide Fenster nur noch eine Bildlaufleiste habe.