2009-11-05 30 views
6

¿Cómo construyo una matriz de botones en una aplicación Winforms?¿Cómo creo una matriz de botones C#?

Lo que trato de hacer es esto: tengo muchos botones en una especie de disposición de calendario, que indican intervalos de tiempo. IE: Monday0700Button, Monday0730Button, Monday0800Button, y así sucesivamente en intervalos de 30 minutos.

Tengo una base de datos xml, donde uno de los campos para citas es <Duration> Cuando la duración = 0.5hrs, y el campo <Time> es igual a "07:00 am", para colorear el 'Monday0700Button'. Cuando la Duración es de 1,0 horas, quiero que llene 'Monday0700Button', así como el siguiente botón de intervalo de tiempo 'Monday0730Button'.

¿Alguna idea? Gracias.

+3

No del todo relacionado con la pregunta, pero con solo mirar un poco hacia adelante, es posible que desee echar un vistazo a http: //www.devexpress.com/Products/NET/Controls/WinForms/Scheduler /, para usar como un planificador de calendario en lugar de escribir el suyo, obtendrá mucho más por menos esfuerzo – RC1140

+0

+1 stalkerh: Usamos ese control (bueno, toda la empresa suite) donde trabajo con excelentes resultados. No podría recomendarlo lo suficiente. –

Respuesta

5

Sí, puede crear una lista de botones como a continuación.

List<Button> listOfButtons = new List<Button>(); 
listOfButtons.Add(yourButton); 
+1

Creo que su respuesta puede estar incompleta. Una lista de objetos de botón es inútil a menos que los botones se puedan mostrar y usar en un formulario. ¿Cómo se conectan los eventos a cada botón? –

+0

@Robert Harvey: en este ejemplo, tendría que agregar los controladores de eventos programáticamente. – FrustratedWithFormsDesigner

+3

Tendrás que hacer algo mejor para obtener mi voto popular. –

3

Sí, no es ningún problema crear una matriz de botones o cualquier objeto. No podrás verlos en el diseñador de Visual Studio, pero funcionarán perfectamente.

Hace mucho tiempo utilicé una serie de botones 2D para construir la interfaz de usuario para una aplicación de calculadora. Había usado un HP-15C durante mucho tiempo, y lo perdí.

alt text

El enfoque conjunto funcionó bien.

Button[] numberButtons=new Button[] { btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btnDecimalPt}; 
    Button[] operationButtons=new Button[] { btnDiv, btnMult, btnSubtract, btnAdd }; 

    foreach (var b in numberButtons) 
     b.Click += new System.EventHandler(this.Number_Click); 

    foreach (var b in operationButtons) 
     b.Click += new System.EventHandler(this.Operation_Click); 

    // etc 

    Button[][] allButtons= 
    { 
     new Button[] {btnSqrt, btnExp, btn10x, btnPow,btnMultInverse, btnCHS, null, null, null, null}, 
     new Button[] {btnN, btnInterest, btnPMT, btnPV, btnFV, null, btn7, btn8, btn9, btnDiv}, 
     new Button[] {btnLn, btnLog, btnSine, btnCosine, btnTangent, btnPi, btn4, btn5, btn6, btnMult}, 
     new Button[] {btnRoll, btnSwap, btnCLRfin, btnCLX, btnCLR, btnEnter, btn1, btn2, btn3, btnSubtract}, 
     new Button[] {btnInt, btnFrac, btnFix, btnStore, btnRecall, null, btn0, btnDecimalPt, btnNotUsed, btnAdd} 
    }; 

    // programmatically set the location 
    int col,row; 
    for(row=0; row < allButtons.Length; row++) 
    { 
     Button[] ButtonCol= allButtons[row]; 
     for (col=0; col < ButtonCol.Length; col++) 
     { 
      if (ButtonCol[col]!=null) 
      { 
       ButtonCol[col].TabIndex = col + (row * allButtons.Length) +1; 
       ButtonCol[col].Font = font1; 
       ButtonCol[col].BackColor = System.Drawing.SystemColors.ControlDark; 
       ButtonCol[col].Size=new System.Drawing.Size(stdButtonWidth, stdButtonHeight); 
       ButtonCol[col].Location=new Point(startX + (col * stdButtonWidth), 
               startY + (row * stdButtonHeight)) ; 
      } 
     } 
    } 
+0

Cuando hago esto, aparece un error de tiempo de ejecución tan pronto como llega a foreach (var b en numberButtons) b.Click + = new System.EventHandler (this.Number_Click); – user1747567

0

Los botones, como todos los elementos de la GUI, son objetos como cualquier otro (que también se pueden visualizar). Así que sí, puedes tener matrices, listas, diccionarios, lo que quieras que contenga botones. Taylor L response tiene un código de muestra.

0

Sí, esto es posible, como demostró Taylor L. La única pega es que las matrices de control de estilo VB6, creadas al copiar y pegar el control, ya no se pueden hacer en el editor de formularios.

3

Sí, definitivamente posible, pero probablemente innecesario.

Si le entiendo correctamente, debería poder agregar un FlowLayoutPanel a su Formulario y luego recorrer su XML, creando un nuevo Botón, según sea necesario. Conecte el controlador de eventos para el evento Click, luego agregue el botón al FlowLayoutPanel llamando al método Add() fuera de la propiedad Controls en su FlowLayoutPanel.

while (reader.Reader()) 
{ 
    // Parse XML here 

    // Instantiate a new button that will be added to your FlowLayoutPanel 
    Button btn = new Button(); 

    // Set button properties, as necessary 
    btn.Text = "Foo"; 
    btn.Click += new EventHandler(SomeButton_Click); 

    // Add the button to the FlowLayoutPanel 
    flowLayoutPanel.Controls.Add(btn); 
} 

Mientras que un FlowLayoutPanel hace que sea fácil de hacer el diseño para los botones, puede que no funcione para usted. Si ese es el caso, tendrá que calcular las coordenadas X e Y para sus botones mientras recorre el XML.

Un problema que encontrará en el enfoque anterior es que siempre llama al mismo controlador de eventos. Como resultado, tendrá que encontrar una manera de determinar en qué botón se ha hecho clic. Un enfoque podría ser extender el control Button para proporcionar propiedades adicionales que se pueden usar para reconocer el período de tiempo.

Cuestiones relacionadas