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.
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.
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.
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);
}
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++;
}
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.