Je souhaite ajouter un bouton pour chaque ligne d'un fichier à un panneau. Mon code est jusqu'ici:
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();
Le problème est que seul le premier contrôle est créé.
Le code a l'air bien mais il pourrait y avoir une situation suivante.
1. Il est possible que vous n'ayez qu'une seule entrée dans le fichier. Vous ne rencontrez donc qu'un bouton ajouté au panneau.
2.La largeur de votre panneau est inférieure à la somme de la largeur de tous les boutons dynamiques.
Je soupçonne que non 2 est la raison principale qui pose problème.
Donc, je vous recommande d'utiliser FlowLayoutPanel . Pour ajouter un contenu dynamique car il met en page automatiquement tous les contrôles enfants.
Chaque fois, il génère le même nom pour les contrôles dynamiques. C'est la raison pour laquelle il ne montre que le dernier. Il écrase simplement le contrôle précédent à chaque fois.
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);
}
Essayez ce 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++;
}
Le problème avec Panel et les contrôles similaires autres que FlowLayoutPanel, c’est lorsque vous créez un contrôle et un deuxième, le second est créé à la même position si vous ne modifiez pas son emplacement de manière dynamique ni ne le configurez en fonction des autres contrôles déjà ajoutés. Votre contrôle est là, il est à l’arrière du premier contrôle.
FlowLayoutPanel est préférable car il ajoutera les contrôles les uns à côté des autres au fur et à mesure que vous les ajouterez, tout en compromettant un contrôle plus précis au niveau de leur positionnement.