Laden...

DockPanel zeigt TreeView nicht korrekt an

Erstellt von xbredoillex vor 14 Jahren Letzter Beitrag vor 14 Jahren 4.926 Views
X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren
DockPanel zeigt TreeView nicht korrekt an

Hi,

ich verwende die Dockpanel Suite.
Es wird ein Childfenster erzeugt, mit einem Treeview gefüllt mit DockState.DockLeft an den linken Rand gedockt.

Problem ist, dass beim Erzeugen des Dockfensters der Treeview nicht zu sehen ist. Ich muss erst einmal auf die "Pinnadel" klicken und das Dockpanel einzuklappen, beim erneuten Aufklappen ist der Treeview sichtbar.
Wenn ich das Fenster als Float oder Document erzeuge ist der Treeview sofort zu sehen.

Wie kann ich es bewerkstelligen, dass das Fenster angedockt erscheint und der Treeview von Anfang an zu sehen ist?

Im Anhang ist der Code zum Problem.

Viele Grüße
xbredoillex

Das Mainform:



using WeifenLuo.WinFormsUI.Docking;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void ButtonToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeView treeView1 = new TreeView();
            treeView1.Dock = DockStyle.Fill;

            Form2 form2 = new Form2();
            form2.Controls.Add(treeView1);
            form2.Show(dockPanel1, DockState.DockLeft);
            form2.MdiParent = this;
        }
    }
}

Das Childfenster:



using WeifenLuo.WinFormsUI.Docking;

namespace WindowsFormsApplication1
{
    public partial class Form2 : DockContent
    {
        public Form2()
        {
            InitializeComponent();
        }
    }
}

2.223 Beiträge seit 2005
vor 14 Jahren

Hallo xbredoillex,

das mit diesem Code dein Tree erst so spät angezeigt wird ist klar,

du hast dich halt an den ButtonToolStripMenuItem_Click gehangen

und dieser wird ja auch erst beim klick auf den Button ausgelöst.

Eine bessere alternative wäre zb im OnLoad des Forms.

Herzliche Grüsse
BlackCoin

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Danke für die schnelle Antwort.
Der Tree soll ja erst nach dem Knopfdruck kommen und nicht beim Formload.
Beim Klick kommt das Childpanel sofort, aber es ist leer. Erst wenn ich einklappe und dann wieder aufklappe ist der Tree da. Der Tree soll aber sofort mit dem Child erscheinen. Oder habe ich dich jetzt falsch verstanden? 😃

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Ich habe mal Screenshots gemacht die das Problem zeigen.

Auf Bild1 sieht man das Childfenster wie es zunächst erscheint, wenn man im Menu auf child klickt.

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Auf Bild2 sieht man dann das Childfenster mit dem weißen (noch leeren) Tree, nachdem man das Childfenster einmal ein- und wieder ausgeklappt hat.

Es spielt keine Rolle ob der Tree gefüllt ist oder nicht, das Problem tritt immer auf. Wie gesagt, bei Float oder Dokument erscheint der Tree mit dem ersten Auftauchen des Childfensters, bei DockLeft/Right etc erscheint der Tree erst nachdem mal das Childfenster einmal ein und ausgeklappt hat, was ziemlich unschön ist, da nicht erwünscht.

2.223 Beiträge seit 2005
vor 14 Jahren

Hmm das sieht ziemlich nach einem Problem in der Docking Library aus.

denn man sieht im ersten Bild ja noch nicht mal den Rahmen nicht des SubControls

Herzliche Grüße
BlackCoin

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

JA das dachte ich mir auch, das Child verhält sich auch komisch. Wenn der Pin umgekippt ist, dann bleibt es trotzdem ausgefahren und fährt nicht automatisch rein.

Aber es kann doch nicht sein das ich der erste bin, der dieses Problem hat?

5.299 Beiträge seit 2008
vor 14 Jahren

Warum machste den Treeview nicht im Designer aufs Form2?

evtl. auch erst den MDI klarmachen, danach erst anzeigen.

Der frühe Apfel fängt den Wurm.

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Hallo ErfinderDesRades,

Ich habe das Tree jetzt in den Form2 veschoben, es wird nun aber gar nicht mehr angezeigt, nur das Panel erscheint:


// Das Parent------------------------------------------
using WeifenLuo.WinFormsUI.Docking;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void ButtonToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Show(dockPanel1, DockState.DockLeft);
            form2.MdiParent = this;
        } 
    }
}

// Das Child------------------------------------------
using WeifenLuo.WinFormsUI.Docking;

namespace WindowsFormsApplication1
{
    public partial class Form2 : DockContent
    {
        public Form2()
        {
            InitializeComponent();
            MakeTree();  
        }

        public void MakeTree()
        {
            TreeView treeView1 = new TreeView();   
            treeView1.Dock = DockStyle.Fill;

            Form1 Parent = new Form1();
            (Parent as Form1).dockPanel1.Controls.Add(treeView1);
        }
    }
}

Wenn ich dich richtig verstanden habe, sollte ich im Parent folgendeReihenfolge einhalten:


//statt dieser:  
form2.Show(dockPanel1, DockState.DockLeft);
form2.MdiParent = this;

//diese hier:
form2.MdiParent = this;
form2.Show(dockPanel1, DockState.DockLeft);

Das geht leider nicht. Alle versuche das MDIParent vor dem Show zu setzen scheiterten mit der Fehlermeldung:


"Invalid Content: ActiveContent must be one of the visible contents, or null if there is no visible content."

Selbst wenn ich mit dem minimal möglichen Code das blanke Child anzeigen lassen will.

Die Fehlermeldung hatten andere auch schon, es sind keine Lösungsansätze zu finden.

3.511 Beiträge seit 2005
vor 14 Jahren

Form1 Parent = new Form1();
(Parent as Form1).dockPanel1.Controls.Add(treeView1);

Was zum ...?

Was erwartest du an dieser Stelle? Das TreeView soll doch in der Form2 sichtbar sein und du packst das Ding aber in einer !neue! Form1. Das das TreeView nie sichtbar sein kann ist doch offensichtlich so.

Und wieso ist das dockPanel1 in der Form1 als public markiert. Das ist grober unfug, wenn ich das mal so sagen darf 😃

Du musst dein TreeView schon der Form2 zuweisen


this.Controls.Add(treeView1);

Desweiteren, warum erstellst du das TreeView nicht im Designer? Dann wäre dir das alles erspart geblieben.

Auf der Homepage (Sourceforge) sollte es neben den eigentlichen Control noch ein Beispielprojekt geben. Schau dir das mal unbedingt an, damit du nachlesen kannst, wie das Ding genau funktioniert.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Hi Khalid,

du siehst die Spuren meiner wilden Experimente. Ich brauche jetzt wohl nicht mehr zu erwähnen, dass ich Anfänger bin 😄
Das Beispiel ziehe ich mir grad rein, ist aber relativ kompliziert und verschachtelt.

Folgendes zu deinen Vorschlägen:

Wenn ich folgendes tue:*Ich erstelle ein neues Projekt mit einem Menu + DockPanel auf Form1 und einem leeren Form2. *In Form1 setze ich das Property IsMdiParent auf true. *Im Form2 ändere ich die Ableitung von "Form" auf "DockContent". *Auf Form2 ziehe ich ein TreeView-Element von der Toolbox und setze es auf Fill. *In Form1 schreibe ich in den MenuButtonKlickEvent folgende Zeilen:


private void ButtonToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.Show(dockPanel1, DockState.DockLeft);
            form2.MdiParent = this;        
        } 
    }

Wenn ich das alles so mache, kommt exakt das Problem aus dem Startbeitrag. Das TreeView wird erst im zweiten Anlauf angezeigt (siehe Screenshots).

Siehst du oder jemand anderes da irgendwo einen (systematischen) Fehler den ich mache? Ich würde gerne ausschließen das es an mir oder meiner IDE liegt.

Es wäre super wenn sich jemand der die dockpanel.dll schon hat, ein paar Minuten Zeit nimmt und schaut, ob der Fehler reproduzierbar ist.

Viele Grüße
xbredoillex

5.299 Beiträge seit 2008
vor 14 Jahren

evtl. auch _erst _den MDI klarmachen, _danach _erst anzeigen.

Der frühe Apfel fängt den Wurm.

3.511 Beiträge seit 2005
vor 14 Jahren

Ich persönlich würde das ganze MDI gedöns einfach rausschmeißen, denn das braucht man für das WeifenLuo Docking nicht...

Im Anhang ein VS2008 Mini Projekt, was genau das macht, was du brauchst.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

Vielen Dank für den Code! Werde ich heute nachmittag alles durchchecken.
Wusste gar nicht das das Dockpanel ohne Mdi-Zeugs geht. Habe mich da auf die Tutorials verlassen.

@ Erfinder des Rades:
Hatte dir gleich nach deinem Post geantwortet, dass dies irgendwie nicht geht, erst den MDI zu setzen und dann Show anzuzeigen, weil dann die besagte Fehlermeldung kommt. Oder Meinst du etwas anderes?

5.299 Beiträge seit 2008
vor 14 Jahren

sorry, habich übersehen, da waren dann schon 2 weitere Posts, und im 2. wars wieder so, da dachtich, du wärst garnet drauf eingegangen.
Bin schon manchmal bisserl schlampig, grad bei längeren Codepassagen (dabei das ging ja eiglich noch) lesen.

Der frühe Apfel fängt den Wurm.

X
xbredoillex Themenstarter:in
46 Beiträge seit 2009
vor 14 Jahren

@ErfinderDesRades: Kein Problem =)

@Khalid: Dein Projekt funktioniert bei mir nicht, aber ich habe die Daten manuell übernommen und es geht jetzt 👍 😁

Des Rätsels Lösung scheint das Mdi-Gedöns zu sein. Ich habe es raus geschmissen und jetzt klappt alles, jedenfalls bisher 😉.

Was ich nicht verstehe: Im TestProjekt der Source von WeifenLuo ist aber trotzdem IsMdiContainer auf true gesetzt und er Arbeitet mit MdiChilds/Parents usw. 8o ?( 🤔

Vielen Dank an alle.
Liebe Grüße
xbredoillex