Autor Beitrag
Nio
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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:

ausblenden volle Höhe 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:

ausblenden volle Höhe 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();
      // 
      // adminViewBase1
      // 
      this.adminViewBase1.Location = new System.Drawing.Point( 1212 );
      this.adminViewBase1.Name = "adminViewBase1";
      this.adminViewBase1.Size = new System.Drawing.Size( 740420 );
      this.adminViewBase1.TabIndex = 0;
      // 
      // button1
      // 
      this.ButtonImControll.Location = new System.Drawing.Point( 00 );
      this.ButtonImControll.Name = "ButtonImControll";
      this.ButtonImControll.Size = new System.Drawing.Size( 7523 );
      this.ButtonImControll.TabIndex = 0;
      this.ButtonImControll.Text = "ButtonImControll";
      this.ButtonImControll.UseVisualStyleBackColor = true;
      // 
      // Form1
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F );
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
      this.ClientSize = new System.Drawing.Size( 773463 );
      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:

ausblenden 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#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: 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") " :D
Nio Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: 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.

ausblenden 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();

            // den neuen anhand des alten buttons definieren

            _buttons.Add(NewButton);
            this.Controls.Add(NewButton);
        }
    }
// ---Snip---

        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") " :D
Nio Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Wiin XP Home
C# VS Express 2008
BeitragVerfasst: Mo 19.01.09 15:14 
user profile iconNio 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 ...

user profile iconNio hat folgendes geschrieben Zum zitierten Posting springen:

public List<Button> MenuButtons
{
get {return _menuButtons;}
}

_________________
Zitat MDSN : " ... C# (gesprochen: "si scharp") " :D
Nio Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 19.01.09 15:28 
user profile iconminiC# hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNio 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 ...

user profile iconNio hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 19.01.09 17:41 
Hallo,

Das sollte über DesignerSerializationVisibility.Content funktionieren, siehe z.B. ToolStrip.Items im Reflector.

_________________
>λ=
Nio Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 20.01.09 11:25 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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