Entwickler-Ecke
WinForms - Speicherung einer Button-Liste aus eigenem User-Controll
Nio - Mo 19.01.09 13:59
Titel: Speicherung einer Button-Liste aus eigenem User-Controll
Hallo erstmal,
ich entwickle gerade an einem User-Controll, worin ich als Propertie eine Liste von Buttons deklariert habe:
C#-Quelltext
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:
| public partial class AdminViewBase : UserControl {
public List<Button> MenuButtons {
get {
return _menuButtons;
}
}
private List<Button> _menuButtons;
public AdminViewBase() {
InitializeComponent();
if ( _menuButtons == null ) {
_menuButtons = new List<Button>();
}
}
protected override void OnPaint( PaintEventArgs e ) {
base.OnPaint( e );
if ( MenuButtons != null ) {
for ( int i = 0; i < MenuButtons.Count; i++ ) {
MenuButtons[i].Width = 80; MenuButtons[i].Height = 50;
MenuButtons[i].Anchor = AnchorStyles.Right; MenuButtons[i].Top = 3; MenuButtons[i].Left = pnlButtons.Width - ( i * 85 ) - 85;
pnlButtons.Controls.Add( MenuButtons[i] );
}
}
}
} |
Nun ist es auch möglich, nachdem man dieses User-Controll auf eine Form gelegt hat, auf dieses Propertie zuzugreifen und selber diese Liste zu füllen, dort lassen sich auch von den einzelnen Elementen die Eigenschaften ändern.
Das Problem ist...
Wenn ich die Form kompiliere und starte, oder wenn ich den Designer schließe und wieder öffne, ist die komplette Liste dieser Buttons wieder verschwunden, heißt: Die Liste wird nicht abgespeichert, bzw. falsch abgespeichert.
Schaue ich nun in Form1.Designer.cs, ist dort zwar die Liste gespeichert, aber folgendermaßen:
C#-Quelltext
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:
| private void InitializeComponent() { this.adminViewBase1 = new Ontiv.Controls.AdminViewBase(); this.ButtonImControll = new System.Windows.Forms.Button(); this.SuspendLayout(); this.adminViewBase1.Location = new System.Drawing.Point( 12, 12 ); this.adminViewBase1.Name = "adminViewBase1"; this.adminViewBase1.Size = new System.Drawing.Size( 740, 420 ); this.adminViewBase1.TabIndex = 0; this.ButtonImControll.Location = new System.Drawing.Point( 0, 0 ); this.ButtonImControll.Name = "ButtonImControll"; this.ButtonImControll.Size = new System.Drawing.Size( 75, 23 ); this.ButtonImControll.TabIndex = 0; this.ButtonImControll.Text = "ButtonImControll"; this.ButtonImControll.UseVisualStyleBackColor = true; this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F ); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size( 773, 463 ); this.Controls.Add( this.adminViewBase1 ); this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler( this.Form1_Load ); this.ResumeLayout( false );
}
#endregion
private Ontiv.Controls.AdminViewBase adminViewBase1; private System.Windows.Forms.Button ButtonImControll; |
Dabei müsste in dieser Form richtigerweise noch stehen:
C#-Quelltext
1:
| this.adminViewBase1.MenuButtons.Add( ButtonImControll ); |
Könnt ihr mir sagen, was ich falsch mache oder wie ich es hinbekomme, dass die Liste gespeichert und auch wieder geladen wird?
Ich habe überall im Internet nach einer Lösung gesucht, aber keine gefunden... wäre also sehr dankbar für eine Lösung.
Viele Grüße,
Nio
miniC# - Mo 19.01.09 14:15
Hallo,
1. verwende mal die den cs tag, das ist in beiden versionen unlesbar ;)
2. in deiner UserControl im OnPaintEvent verwendest du "pnlButtons", welches aber kein Feld der Klasse ist.
gruß,
miniC#
Nio - Mo 19.01.09 14:21
Für die Antwort bedanke ich mich erstmal :)
1. Hab jetzt einen cs tag benutzt, wusste ja nicht, dass es soetwas gibt ;)
2. pnlButtons ist ein Panel, in dem die Buttons angezeigt werden sollen, eigentlich ist der panel und die OnPaintMethode auch nicht von Wichtigkeit bei der Problemlösung, was ich erreichen möchte ist, dass diese Buttons in der Liste gespeichert werden und auch gespeichert bleiben, sodass man bei einem Neustart der IDE die Liste immernoch so gefüllt hat, wie vorher, was zur Zeit nicht funktioniert.
Viele Grüße,
Nio
miniC# - Mo 19.01.09 14:40
Was meinst du genau mit Neustart der IDE ? Ich denke du musst dein Projekt mal genauer beschreiben. Auf die Gefahr hin dich misszuverstehen.
C#-Quelltext
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:
| public partial class ButtonStack : UserControl { public ButtonStack() { InitializeComponent(); _buttons = new List<Button>(); } public ButtonStack(List<Button> Buttons) { InitializeComponent(); _buttons = Buttons; }
private List<Button> _buttons;
public void AddButton() { Button LastButton = _buttons[_buttons.Count - 1]; Button NewButton = new Button();
_buttons.Add(NewButton); this.Controls.Add(NewButton); } }
private ButtonStack _mystack = new ButtonStack(new List<Button>() {SomeButton}); |
so würde ich das machen ;) abgesehen davon ... warum verwendest du nicht eine der forgefertigten lösungen wie die Menustrip klasse oder ähnliches ?
Nio - Mo 19.01.09 14:57
Klar, so geht es auch, aber das löst immernoch nicht das eigentliche Problem...
Das User-Controll soll ein allgemeines Controll werden, welches man in jeder beliebigen Applikation einsetzen kann. Dazu platziert man es dann auf sein Applikationsformular, wo man es hin haben möchte, damit sind aber die Buttons noch nicht auf diesem platzierten User-Controll definiert.
Wenn ich nun die Buttonliste als Propertie definiere, wird genau diese Eigenschaft in der Propertieliste von dem Controll angezeigt, dort kann man auch drauf zugreifen und Buttons hinzufügen. Das ist das, was ich erreichen möchte, was auch funktioniert.
Allerdings wird diese Liste nicht richtig abgespeichert, wenn du also nun alles abspeicherst und das Formular neu lädst, ist diese Liste wieder leer.
Mit deiner Lösung müsste man immer im Code rum werkeln, um die Buttons in das User-Controll zu füllen, ich möchte es aber über diese Eigenschaft erreichen, damit man es im Designer direkt machen kann.
Viele Grüße,
Nio
miniC# - Mo 19.01.09 15:14
Nio hat folgendes geschrieben: |
| Wenn ich nun die Buttonliste als Propertie definiere, wird genau diese Eigenschaft in der Propertieliste von dem Controll angezeigt ... |
deine Property
MenuButtons ist doch readonly, bzw hat garkeinen setter ...
Nio hat folgendes geschrieben : |
public List<Button> MenuButtons
{
get {return _menuButtons;}
}
|
Nio - Mo 19.01.09 15:28
miniC# hat folgendes geschrieben : |
Nio hat folgendes geschrieben: | | Wenn ich nun die Buttonliste als Propertie definiere, wird genau diese Eigenschaft in der Propertieliste von dem Controll angezeigt ... |
deine Property MenuButtons ist doch readonly, bzw hat garkeinen setter ...
Nio hat folgendes geschrieben : |
public List<Button> MenuButtons
{
get {return _menuButtons;}
}
|
|
Was nicht heißt, dass man aus dieser Liste keine Funktionen, wie z.B. "Add" ausführen kann um neue Elemente hinzuzufügen. Wenn ich darüber hinaus auch eine set Methode implementiere, tritt eine Exception beim platzieren des User-Controlls auf, die besagt, dass eine Button nicht serilizable, was mir keinen Aufschluss über den wirklichen Fehler gibt. Lass ich die set Methode weg, lässt sich alles wie gehabt steuern, das Problem besteht weiterhin.
Kha - Mo 19.01.09 17:41
Hallo,
Das sollte über DesignerSerializationVisibility.Content funktionieren, siehe z.B. ToolStrip.Items im Reflector.
Nio - Di 20.01.09 11:25
Kha hat folgendes geschrieben : |
Hallo,
Das sollte über DesignerSerializationVisibility.Content funktionieren, siehe z.B. ToolStrip.Items im Reflector. |
Vielen lieben danke, jetzt klappt es :)
Die Lösung war echt einfacher, als ich dachte...
Viele Grüße,
Nio
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!