Autor |
Beitrag |
Chiyoko
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: So 18.04.10 18:49
Huhu,
ich wollte gerne Steuerelemente zur Laufzeit erzeugen.
Nur weis ich nicht, wie ich sie wieder entfernen soll.
Und so ganz klappt das alles nicht, auch nicht nach vielen Anlaeufen.
Das ist mein Test.
Die Steuerelemente zu erzeugen geht.Objektinstanz festlegen und
danach die Eigenschaften.
Ich habe eine Form, mit einem Splitcontainer und im Splitcontainer.Panel1
ein Treeview mit dem ich dann je nach Index die Elemente erzeugen moechte.
Am besten mit dem Event:
C#-Quelltext 1: 2: 3: 4:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
} |
Index 1 = label 1 erzeugen, Index 2 = label2 erzeugen, label 1 ausblenden/entfernen
Ich habe sowas aehnliches mal mit den usercontrols gemacht, die bei "Afterexpand"
dann erstellt wurden.Beim label klappt das aber nicht.
Oder reicht es aus, sie dann nur noch mit "hide" zu entfernen?
(Was auch nicht klappte;))
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace autogeneration { public partial class Form1 : Form { private System.ComponentModel.IContainer components1 = null;
public Form1() { InitializeComponent(); }
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
}
private void treeView1_AfterExpand(object sender, TreeViewEventArgs e) { this.components1 = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1)); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
if(e.Node.SelectedImageIndex == 0) { this.splitContainer1.Panel2.Controls.Add(this.label1); this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(59, 43); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(79, 13); this.label1.TabIndex = 0; this.label1.Text = "Das ist ein test:"; } if (e.Node.SelectedImageIndex == 1) { this.splitContainer1.Panel2.Controls.Add(this.label2); this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(61, 43); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(79, 13); this.label2.TabIndex = 1; this.label2.Text = "Das ist ein 2ter test:"; } } } } |
|
|
JüTho
      
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
|
Verfasst: So 18.04.10 19:15
Hallo,
das, was innerhalb der if-Zweige steht, ist im wesentlichen korrekt. Allenfalls wäre es sinnvoll, das Controls.Add nach der Initialisierung auszuführen. So, wie es in der Designer.cs gemacht wird, kannst du es auch manuell machen.
Inwiefern klappt das Erzeugen nicht? Wieso benutzt du components1 und ComponentResourceManager in deinem Teil der Klasse? So etwas steht doch in der Designer.cs.
Zum Löschen ist label1.Dispose aufzurufen. Dazu muss Controls.Find aufgerufen werden, und das dadurch getroffene Control steht zum Löschen zur Verfügung.
Übrigens gibt es switch. Hide genügt nicht, das verbirgt ein Control nur (identisch mit Umschalten von Visible auf true/false).
Jürgen
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: So 18.04.10 20:39
Danke fuer die fixe Antwort^^
Naja, es klappt schon alles, nur sah das durch das ueberlappen beider
Steuerelemente komisch aus.Funktioniert allerdings.
Zitat: | C#-Quelltext 1:
| Zum Löschen ist label1.Dispose aufzurufen. Dazu muss Controls.Find aufgerufen werden, und das dadurch getroffene Control steht zum Löschen zur Verfügung. | |
Da das ja nicht wenig Steuerelemente sind, die ich dort erzeugen will,
waere es doch sinnvoll, alles in eine Methode zu packen oder?
Ich muss ja alle vorhandenen Steuerelemente nach dem umschalten des Indexes
loeschen, oder gibts da andere wege?
Die Zeile mit dem ComponentResourccenManager war ein Fehler, ich hab mich an meinem
alten Projekt orientiert und erstmal alles kopiert.
Danach natuerlich die Zeile schlichtweg uebersehen.
Zitat: | Übrigens gibt es switch. |
->switch(e.node.selectedImageIndex)?
Oder was meinst du damit?
Wenn ja, die if schleife war zum testen.
Ich nutz sonst der Uebersichtlichkeithalber immer Switch/case.#
EDIT:
Laesst sich nicht loeschen.Auch nicht ueber default...
Hab ich was vergessen?Ich hab versucht, deinen Anweisungen zu Folgen..
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace autogeneration { public partial class Form1 : Form { private System.ComponentModel.IContainer components1 = null;
public Form1() { InitializeComponent(); }
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { this.components1 = new System.ComponentModel.Container();
this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
switch (e.Node.SelectedImageIndex) { case 0: this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(59, 20); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(79, 13); this.label1.TabIndex = 0; this.label1.Text = "Das ist ein test:"; this.splitContainer1.Panel2.Controls.Add(this.label1); this.Controls.Find("label2", true); this.label2.Dispose(); this.Update(); break; case 1: this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(61, 43); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(79, 20); this.label2.TabIndex = 1; this.label2.Text = "Das ist ein 2ter test:"; this.splitContainer1.Panel2.Controls.Add(this.label2); this.Controls.Find("label1", true); this.label1.Dispose(); this.Update(); break; default: this.label1.Dispose(); this.label2.Dispose(); break;
} } } } |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: So 18.04.10 22:38
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: So 18.04.10 22:50
Panels umzuschalten waere problemlos.Das ganz hab ich mit UserControls schon durch.
Stell dir ein Panel vor, auf dem ich 2 Labels habe und eine Textbox.
Dann moechte ich aber an der selben Stelle noch ein label haben, das
ich erst gebrauchen will, wenn ich im treeview den index umgeschalten hab.
Und dabei muss das andere label weg.
Das klappt aber nicht wie ich es gerne haette.
Mit Remove habe ich es auch gerade getestet.
Aber ich glaube, du hast mich da gerade auf eine doofe Idee gebracht.
Ich teste erstmal..
So, neuer versuch, neues glueck...klappt nich^^
ich glaub ich steig auf usercontrols um, wenn das nicht geht...
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace autogeneration { public partial class Form1 : Form { private Label label1; private Label label2; private Label label3; public Form1() { InitializeComponent(); } private void Erzeuge_labe1() { this.label1 = new System.Windows.Forms.Label();
this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(59, 20); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(79, 13); this.label1.TabIndex = 0; this.label1.Text = "Das ist ein test:"; this.splitContainer1.Panel2.Controls.Add(this.label1); } private void Erzeuge_labe2() { this.label2 = new System.Windows.Forms.Label();
this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(61, 43); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(79, 20); this.label2.TabIndex = 1; this.label2.Text = "Das ist ein 2ter test:"; this.splitContainer1.Panel2.Controls.Add(this.label2); } private void Erzeuge_labe3() { this.label3 = new System.Windows.Forms.Label(); this.label3.AutoSize = true; this.label3.Location = new System.Drawing.Point(61, 60); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(79, 20); this.label3.TabIndex = 2; this.label3.Text = "Das ist ein 3ter test:"; this.splitContainer1.Panel2.Controls.Add(this.label3); }
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { switch (e.Node.SelectedImageIndex) { case 1: Erzeuge_labe1(); if (splitContainer1.Panel2.Controls.Contains(label2) && splitContainer1.Panel2.Controls.Contains(label3)) { splitContainer1.Panel2.Controls.Remove(label2); splitContainer1.Panel2.Controls.Remove(label3); this.label2.Dispose(); this.label3.Dispose(); } break; case 2: Erzeuge_labe2(); if (splitContainer1.Panel2.Controls.Contains(label1) && splitContainer1.Panel2.Controls.Contains(label3)) { splitContainer1.Panel2.Controls.Remove(label1); splitContainer1.Panel2.Controls.Remove(label3); this.label1.Dispose(); this.label3.Dispose(); } break; case 3: Erzeuge_labe3(); if (splitContainer1.Panel2.Controls.Contains(label2) && splitContainer1.Panel2.Controls.Contains(label1)) { splitContainer1.Panel2.Controls.Remove(label2); splitContainer1.Panel2.Controls.Remove(label1); this.label2.Dispose(); this.label1.Dispose(); } break;
} }
} } |
Ach Kha, jetzt weis ich worauf du hinaus willst...steuerelemente erstellen und panels dann einfach ausblenden, ohne die Steuerelemente zu entfernen...
ja ich denke, ich machs vorlaeufig so..
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Di 20.04.10 14:28
So, ich hab das soweit mal gemacht.
2 Panel im Designer gesetzt, und die darauf befindlichen Steuerelemente manuel im Code erstellt.
Mein Problem ist jetzt:
Ich moechte nicht bei jeder Case Anweisung festlegen wollen, welches Panel gerade Sichtbar ist, da ich bei mindestens 100 Indexern das selbe Panel verwende.
Gibt es eine Moeglichkeit, ohne unbedingt ...
C#-Quelltext 1: 2: 3: 4:
| if (e.Node.SelecetedImageIndex == 1 || e.Node.SelecetedImageIndex == 2 || e.Node.SelecetedImageIndex == 3) { PanelX.Show(); } |
...zu verwenden.Vielleicht sowas wie "Contains"?
Auch hat das oben genannte den Nachtteil, dass sich das Panel bei jedem Klick auf einen Indexer neu rendert.
Haette da jemand eine bessere idee?
Danke.
EDIT:Da das anscheind normal ist, wuerd ich i-wie das neuzeichnen unterbinden.Mal schauen, was ich so finde.
EDIT 2:
Nun habe ich versucht, das Panel zu buffern.Aber auch das funktioniert nur bedingt.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| public class DoubleBufferPanel: Panel { public DoubleBufferPanel() { this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles(); }
} |
|
|
Chiyoko 
      
Beiträge: 298
Erhaltene Danke: 8
Win 98, Win Xp, Win 10
C# / C (VS 2019)
|
Verfasst: Mi 21.04.10 13:56
Lol, habs raus.
Hatte es eigentlich schon richtig aber dank eines freundes habe ich gesehen, das
man NUR remove braucht, da dispose automatisch aufgerufen wird, wenn ein steuerelement nicht mehr gueltig ist.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace autogeneration { public partial class Form1 : Form { private Label label1 = new Label(); private Label label2 = new Label();
public Form1() { InitializeComponent(); }
private void Erzeuge_labe1() { label1.AutoSize = true; label1.Location = new System.Drawing.Point(59, 60); label1.Name = "label1"; label1.Size = new System.Drawing.Size(79, 13); label1.TabIndex = 0; label1.Text = "Das gehoert zu Panel 1"; panel2000.Controls.Add(label1);
} private void Erzeuge_labe2() { label2.AutoSize = true; label2.Location = new System.Drawing.Point(59, 20); label2.Name = "label2"; label2.Size = new System.Drawing.Size(79, 13); label2.TabIndex = 1; label2.Text = "Das gehoert zu Panel 2"; panel2000.Controls.Add(label2); }
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
switch (e.Node.SelectedImageIndex) { case 0: panel2000.Controls.Remove(label1); Erzeuge_labe2(); break;
case 1: panel2000.Controls.Remove(label2); Erzeuge_labe1(); break;
} }
private void Form1_Load(object sender, EventArgs e) { Erzeuge_labe1(); } } } |
|
|
|