it-swarm.com.de

Hinzufügen von Steuerelementen zum Bedienfeld in einer Schleife

Ich möchte einem Panel für jede Zeile in einer Datei eine Schaltfläche hinzufügen. Mein Code ist bisher:

StreamReader menu = new StreamReader("menu.prefs");
int repetition = 0;

while(!menu.EndOfStream)
{
    Button dynamicbutton = new Button();
    dynamicbutton.Click += new System.EventHandler(menuItem_Click);
    dynamicbutton.Text = menu.ReadLine();
    dynamicbutton.Visible = true;
    dynamicbutton.Location = new Point(4+repetition*307, 4);
    dynamicbutton.Height = 44;
    dynamicbutton.Width = 203;
    dynamicbutton.BackColor = Color.FromArgb(40,40,40);
    dynamicbutton.ForeColor = Color.White;
    dynamicbutton.Font = new Font("Lucida Console", 16);
    dynamicbutton.Show();
    menuPanel.Controls.Add(dynamicbutton);
    repetition++;
    MessageBox.Show(dynamicbutton.Location.ToString());
}
menu.Close();

Das Problem ist, dass nur das erste Steuerelement erstellt wird.

7
YoshieMaster

Der Code sieht gut aus, aber es kann folgende Situationen geben.

1. Möglicherweise ist nur ein Eintrag in der Datei vorhanden, sodass nur eine Schaltfläche zum Bedienfeld hinzugefügt wird.

2. Ihre Bedienfeldbreite ist kleiner als die Summe aller dynamischen Schaltflächen.

Ich vermute, Nr. 2 ist der Hauptgrund, der das Problem verursacht.

Daher empfehle ich die Verwendung von FlowLayoutPanel . Hinzufügen eines dynamischen Inhalts zum automatischen Layout aller untergeordneten Steuerelemente.

9
crypted

Jedes Mal wird derselbe Name für dynamische Steuerelemente generiert. Das ist der Grund, warum es nur das letzte zeigt. Das vorherige Steuerelement wird einfach jedes Mal überschrieben.

3
AspMyLife
int x = 4;
int y = 4;
foreach(PhysicianData pd in listPhysicians)
{
   x = 4;
   y = panPhysicians.Controls.Count * 30;
   RadioButton rb = new RadioButton();
   rb.CheckedChanged += new System.EventHandler(rbPhysician_CheckedChanged);
   rb.Text = pd.name;
   rb.Visible = true;
   rb.Location = new Point(x, y);
   rb.Height = 40;
   rb.Width = 200;
   rb.BackColor = SystemColors.Control;
   rb.ForeColor = Color.Black;
   rb.Font = new Font("Microsoft Sans Serif", 10);
   rb.Show();
   rb.Name = "rb" + panPhysicians.Controls.Count;
   panPhysicians.Controls.Add(rb);
}
2
Daniel Howard

Versuchen Sie diesen Code

        StreamReader menu = new StreamReader("menu.prefs");
        var str = menu.ReadToEnd();
        var items = str.Split(new string[] {"\r\n" } , StringSplitOptions.RemoveEmptyEntries);
        foreach (var item in items)
        {
           Button dynamicbutton = new Button();
           dynamicbutton.Click += new System.EventHandler(menuItem_Click);
           dynamicbutton.Text = item;
           dynamicbutton.Visible = true;
           dynamicbutton.Location = new Point(4+repetition*307, 4);
           dynamicbutton.Height = 44;
           dynamicbutton.Width = 203;
           dynamicbutton.BackColor = Color.FromArgb(40,40,40);
           dynamicbutton.ForeColor = Color.White;
           dynamicbutton.Font = new Font("Lucida Console", 16);
           dynamicbutton.Show();
           menuPanel.Controls.Add(dynamicbutton);
           repetition++;
        }
0
Peyman

Das Problem mit Panel und ähnlichen Steuerelementen außer FlowLayoutPanel besteht darin, dass beim Erstellen eines Steuerelements und eines zweiten Steuerelements das zweite an derselben Position erstellt wird, wenn Sie seinen Speicherort nicht dynamisch ändern oder es gemäß den anderen bereits hinzugefügten Steuerelementen festlegen. Ihre Kontrolle ist da, sie befindet sich auf der Rückseite der ersten Kontrolle.

Ein flowLayoutPanel ist besser, da es die Steuerelemente beim Hinzufügen nebeneinander hinzufügt und gleichzeitig eine feinere Steuerung bei ihrer Positionierung beeinträchtigt.

0
driverobject