| Autor |
Beitrag |
Nio
Hält's aus hier
Beiträge: 10
|
Verfasst: Mo 19.01.09 13:59
Hallo erstmal,
ich entwickle gerade an einem User-Controll, worin ich als Propertie eine Liste von Buttons deklariert habe:
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:
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
Zuletzt bearbeitet von Nio am Mo 19.01.09 14:17, insgesamt 1-mal bearbeitet
|
|
miniC#
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: 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#
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
Nio 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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#
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: 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 ?
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
Nio 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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#
      
Beiträge: 75
Wiin XP Home
C# VS Express 2008
|
Verfasst: 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;}
}
|
_________________ Zitat MDSN : " ... C# (gesprochen: "si scharp") "
|
|
Nio 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 19.01.09 17:41
Hallo,
Das sollte über DesignerSerializationVisibility.Content funktionieren, siehe z.B. ToolStrip.Items im Reflector.
_________________ >λ=
|
|
Nio 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
|
|
|