2011-06-20 33 views
6

Deseo agregar un botón para cada línea en un archivo a un panel. Mi código hasta ahora es:C# Agregar controles al panel en un bucle

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

El problema es que sólo el primer control se crea.

+0

¿Ha comprobado en la depuración si el ciclo se repite más de una vez y si el 'menuPanel.Controls' realmente contiene solo 1 botón? –

Respuesta

9

El código se ve bien, pero podría haber una siguientes situaciones.

1.Puede tener solo una entrada en el archivo, por lo que solo está experimentando un botón agregado al panel.

2. El ancho de su panel es menor que la suma de todos los botones dinámicos de ancho.

Sospecho que no 2 es la razón principal que está causando el problema.

Por lo tanto, le recomiendo que use FlowLayoutPanel. Para agregar un contenido dinámico, ya que distribuye automáticamente todos los controles secundarios.

+0

¡Soy un idiota! ¿¡Qué demonios estaba pensando!? Usted señor es un genio. ¡Los botones están destinados a mostrarse en una columna! Fallé de una manera épica allí. – YoshieMaster

0

probar este código

 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

No. Sin suerte, incluso después de corregir los pocos errores. – YoshieMaster

3

Cada vez está generando el mismo nombre para los controles dinámicos. Esa es la razón por la que muestra solo la última. Simplemente sobrescribe el control anterior cada vez.

+0

Sí, esto es correcto, pero el último botón no será accesible porque todos tienen el mismo nombre vacío, asegúrese de agregar un sufijo incremental al nombre de cada botón. – peterincumbria

0

El problema con el Panel y controles similares distintos de FlowLayoutPanel es cuando crea un control y el segundo se crea en la misma posición si no está cambiando su ubicación dinámicamente o configurándolo de acuerdo con el otro ya controles agregados Tu control está ahí, está en la parte posterior del primer control.

Un flowLayoutPanel es mejor, ya que agregará los controles uno al lado del otro a medida que los agrega al tiempo que se compromete un control más preciso en su posición.

-1

También tengo problemas similares con los paneles. Por lo que está haciendo, podría ser útil simplemente agregar cadenas a un cuadro de lista en lugar de usar etiquetas y un panel. Eso debería ser más simple.

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

Esto funciona perfectamente. Lo modifiqué y lo usé para hacer un panel de botones de radio de médicos. Usé la cuenta de los controles en el panel como el índice del control para agregar a los nombres para hacerlos únicos –

Cuestiones relacionadas