none
recorrer los controles de un form de manera condicional C# RRS feed

  • Pregunta

  • hola amigos que tal, quería hacerles una consulta a ustedes que estan mas experimentados, la cuestion es la siguiente, tengo una base de datos sql server donde tengo el registro de lo que serian camas en este caso, y queria mostrar en un form de manera grafica sin un usar un datagriv, si estan ocupadas o no. seria por ejemplo si la cama esta ocupada cambiarle el backcolor al boton de la cama. no se si me di a entender pero si me pueden ayudar se los agradeceria de antemano. 
    viernes, 21 de septiembre de 2018 15:41

Respuestas

  • Te actualizo el código.

    Si te das cuenta en la propiedad Tag del boton le seteo el Id Unico de la cama. Con ese Id puedes obtener la información que quieras, Actualizar en la Base de Datos, Eliminar. Etc. Porque recuerda que el formulario representa tu tabla.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WinCama
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                var camas = ObtenerCamas();
    
                CargarCamas(camas);
            }
    
            private List<Cama> ObtenerCamas()
            {
                using (SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=BelcorpTest;Integrated Security=True"))
                {
                    var lista = new List<Cama>();
                    SqlCommand cmd = new SqlCommand("select * from Cama", cn);
                    cmd.CommandType = System.Data.CommandType.Text;
                    cn.Open();
                    var reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        lista.Add(new Cama
                        {
                            IdCama = Convert.ToInt32(reader["IdCama"]),
                            PosicionX = Convert.ToInt32(reader["PosicionX"]),
                            PosicionY = Convert.ToInt32(reader["PosicionY"]),
                            EstadoCama = Convert.ToInt32(reader["EstadoCama"]),
                            DescripcionCama = Convert.ToString(reader["DescripcionCama"])
                        });
                    }
    
                    return lista;
                }
            }
    
            private void CargarCamas(List<Cama> camas)
            {
    
               
                foreach (var cama in camas)
                {
    
    
                    System.Windows.Forms.Button buttonCama = new System.Windows.Forms.Button();
                    buttonCama.Location = new System.Drawing.Point(cama.PosicionX, cama.PosicionY);
                    buttonCama.Size = new System.Drawing.Size(60, 80);
                    buttonCama.TabIndex = 0;
                    buttonCama.Text = cama.DescripcionCama;
                    buttonCama.Tag = cama.IdCama;
                    buttonCama.Click += ButtonCama_Click;
                    buttonCama.UseVisualStyleBackColor = true;
                    buttonCama.BackColor = cama.EstadoCama == 1 ? Color.Green: Color.Gray;
                    buttonCama.ForeColor = Color.Black;
                    Controls.Add(buttonCama);
    
                }
            }
    
            private void ButtonCama_Click(object sender, EventArgs e)
            {
                var button = sender as Button;
                var idCama = button.Tag;
            }
    
            public class Cama
            {
                public int IdCama { get; set; }
                public int PosicionX { get; set; }
                public int PosicionY { get; set; }
                public string DescripcionCama { get; set; }
                public int EstadoCama { get; set; }
            }
        }
    }


    • Editado Blueh Scouth viernes, 21 de septiembre de 2018 20:16
    • Marcado como respuesta Henry_Dubon viernes, 21 de septiembre de 2018 20:34
    viernes, 21 de septiembre de 2018 20:13

Todas las respuestas

  • Envia algo (codigo, imagenes,etc.) de lo que ya tengas y explica un poco que supones que harán quienes operaran la aplicación. Asi podrás recibir ayuda.

    Saludos


    Pedro López

    viernes, 21 de septiembre de 2018 16:50
  • private void matapc() {
                try {
                    string query;
                    query = "select tipo from medicina_hombres where sala = 'medicina hombres' and n_cama = '102'";
                    SqlCommand com = new SqlCommand(query, sql);
                    SqlDataReader dr;
                    sql.Open();
                    dr = com.ExecuteReader();
                    if (dr.Read()) {
                        if (dr["tipo"].ToString() == "Ocupada") {
                             bunifuTileButton1.BackColor = Color.DarkRed;
                             bunifuTileButton1.colorActive = Color.DarkRed;
                             bunifuTileButton1.color = Color.DarkRed;
                        }
                        if (dr["tipo"].ToString() == "Alta")
                        {
                            bunifuTileButton1.BackColor = Color.DarkGreen;
                            bunifuTileButton1.colorActive = Color.DarkGreen;
                            bunifuTileButton1.color = Color.DarkGreen;
                        }
                        if (dr["tipo"].ToString() == "Pre-Alta")
                        {
                            bunifuTileButton1.BackColor = Color.SaddleBrown;
                            bunifuTileButton1.colorActive = Color.SaddleBrown;
                            bunifuTileButton1.color = Color.SaddleBrown;
                        }
                    }
    tengo este fragmento de codigo, en el cual lo que quisiera es que se aumentara(no se si con un ciclo For por ejemplo) el numero de boton y el numero de cama, pero no se como recorrer lo controles del form.
    viernes, 21 de septiembre de 2018 16:53
  • Para recorrer los controles

    foreach  (Control de control  en este .Controles) { 
        
    // Filtramos solo aquellos de tipo PANEL  
        
    if  ((control.GetType ()  ==  Panel)) { 
            control.Visible  
    = falso; 
        

        
    }


    Pedro López

    viernes, 21 de septiembre de 2018 18:02
  • pues en teoría es lo siguiente, creo que no me explique bien, en el código que adjunte anteriormente se puede ver como se aplica ciertas configuraciones a unos botones por medio en un registro en la base de datos, entonces yo quería saber si hay forma de automatizar eso, o en cuestión hacerlo dinámico por medio de un ciclo o algo ya que la cantidad de camas son algo grandes(33) y tendría que copiar y pegar ese código 33 veces para que funcionara, entonce no se si hay forma de realizarlo con un ciclo o algo(los nombres de los botones van en secuencia b1,b2,3 etc).
    viernes, 21 de septiembre de 2018 18:12
  • Lo que entiendo es que necesitas crear los botones en tiempo de ejecución a partir de la base de datos. Eso seria lo más practico ya que el número de camas podría crecer o disminuir. Y solo tendrías que agregar o eliminar los registros en tu tabla para que se refleje en tu formulario.
    viernes, 21 de septiembre de 2018 18:36
  • si es lo que busco hacer solo que no se podría crear los botones en tiempo de ejecución ya que se sigue una maqueta(la que esta adjuntada en el link), entonces los botones seguirían una condición que si la cama esta en uso, cambia su color.

    https://drive.google.com/open?id=1YVVK-MBPhThul5mmdl1dzl5yAB76c9oQ

    viernes, 21 de septiembre de 2018 19:01
  • Usa este código creo que es  lo que necesitas, Ten en cuenta que la lista es tu consulta en la base de datos.

    PD: En este ejemplo las camas se ordenan en dos columnas.

    Me comentas.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WinCama
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                var camas = new List<Cama>();
                camas.Add(new Cama { TipoCama = "Ocupada", Posicion = 1, Color = Color.Blue });
                camas.Add(new Cama { TipoCama = "Alta", Posicion = 2, Color = Color.Green });
                camas.Add(new Cama { TipoCama = "Pre-Alta", Posicion = 3, Color = Color.Red });
                camas.Add(new Cama { TipoCama = "Disponibles", Posicion = 4, Color = Color.Black });
                camas.Add(new Cama { TipoCama = "Disponibles Feriados", Posicion = 5, Color = Color.Black });
                camas.Add(new Cama { TipoCama = "Disponibles FFines Semana", Posicion = 6, Color = Color.Black });
                camas.Add(new Cama { TipoCama = "Cama Ortopedica", Posicion = 7, Color = Color.Black });
                CargarCamas(camas);
            }
    
            private void CargarCamas(List<Cama> camas)
            {
    
                var y = 0;
                int i = 0;
                foreach (var cama in camas)
                {
                    if (i == 2)
                    {
                        y += 50;
                        i = 0;
                    }
    
                    bool esImpar = (cama.Posicion % 2) != 0;
                    var x = esImpar ?0:150;                
                    System.Windows.Forms.Button buttonCama = new System.Windows.Forms.Button();
                    buttonCama.Location = new System.Drawing.Point(x, y);
                    buttonCama.Size = new System.Drawing.Size(150, 50);
                    buttonCama.TabIndex = 0;
                    buttonCama.Text = cama.TipoCama;
                    buttonCama.UseVisualStyleBackColor = true;
                    buttonCama.BackColor = cama.Color;
                    buttonCama.ForeColor = Color.White;
                    Controls.Add(buttonCama);
                   
                    
                    i++;
                }
            }
    
            public class Cama
            {
                public int Posicion { get; set; }
                public string TipoCama { get; set; }
                public Color Color { get; set; }
            }
        }
    }





    • Editado Blueh Scouth viernes, 21 de septiembre de 2018 19:51
    viernes, 21 de septiembre de 2018 19:14
  • si, el codigo es funcional y cumple su cometido, pero, yo lo tengo que hacer con una maqueta ya hecha,

    https://drive.google.com/open?id=1YVVK-MBPhThul5mmdl1dzl5yAB76c9oQ 

    y hago la comparación con los registros de la base de datos para saber si esta ocupada o no, de momento lo he logrado pero con una gran cantidad de query's pero eso afecta el rendimiento del programa ya que lo hace demasiadas veces.

    por ejemplo, al cargar el formulario cargo un metodo que comprueba si la cama 1 esta ocupada o no

     query = "select tipo from medicina_hombres where sala = 'medicina hombres' and n_cama = '107'";
                    com = new SqlCommand(query, sql);
                    dr = com.ExecuteReader();
                    if (dr.Read())
                    {
                        if (dr["tipo"].ToString() == "Ocupada")
                        {
                            bunifuTileButton8.BackColor = Color.DarkRed;
                            bunifuTileButton8.colorActive = Color.DarkRed;
                            bunifuTileButton8.color = Color.DarkRed;
                        }
                        if (dr["tipo"].ToString() == "Alta")
                        {
                            bunifuTileButton8.BackColor = Color.DarkGreen;
                            bunifuTileButton8.colorActive = Color.DarkGreen;
                            bunifuTileButton8.color = Color.DarkGreen;
                        }
                        if (dr["tipo"].ToString() == "Pre-Alta")
                        {
                            bunifuTileButton8.BackColor = Color.SaddleBrown;
                            bunifuTileButton8.colorActive = Color.SaddleBrown;
                            bunifuTileButton8.color = Color.SaddleBrown;
                        }
                        if (dr["tipo"].ToString() == "-")
                        {
                            bunifuTileButton8.BackColor = Color.DimGray;
                            bunifuTileButton8.colorActive = Color.DimGray;
                            bunifuTileButton8.color = Color.DimGray;
                        }
                    }

    entonces los nombres de los botones van en secuencia al igual que las camas no se si hay forma de recorrerlos de forma mas dinamica.


    • Editado Henry_Dubon viernes, 21 de septiembre de 2018 19:24
    viernes, 21 de septiembre de 2018 19:21
  • En todo caso si es una maqueta la posición de la cama tendrías que guardarla en la base de datos.

    Tendrías que armar un plano con las posiciones.

    viernes, 21 de septiembre de 2018 19:24
  • de hecho no habia pensado en eso, tienes razon, hare unas pruebas.
    viernes, 21 de septiembre de 2018 19:38
  • Te doy un ejemplo.


    Create Table Cama
    (
    IdCama int primary key identity(1,1),
    DescripcionCama varchar(100),
    PosicionX int,
    PosicionY int,
    EstadoCama int
    )
    
    --Para un boton de 60x80
    
    insert into Cama(DescripcionCama,PosicionX,PosicionY,EstadoCama)
    values('112',0,0,1),
    ('111',60,0,1),
    ('110',120,0,1),
    ('109',180,0,1),
    ('108',240,0,1),
    ('107',300,0,1),
    ('106',360,0,1),
    ('105',420,0,1),
    ('104',480,0,1),
    ('103',540,0,1),
    ('102',600,0,1),
    ('101',660,0,1),
    ('125',720,0,0)

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WinCama
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                var camas = ObtenerCamas();
    
                CargarCamas(camas);
            }
    
            private List<Cama> ObtenerCamas()
            {
                using (SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=Test;Integrated Security=True"))
                {
                    var lista = new List<Cama>();
                    SqlCommand cmd = new SqlCommand("select * from Cama", cn);
                    cmd.CommandType = System.Data.CommandType.Text;
                    cn.Open();
                    var reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        lista.Add(new Cama
                        {
                            PosicionX = Convert.ToInt32(reader["PosicionX"]),
                            PosicionY = Convert.ToInt32(reader["PosicionY"]),
                            EstadoCama = Convert.ToInt32(reader["EstadoCama"]),
                            DescripcionCama = Convert.ToString(reader["DescripcionCama"])
                        });
                    }
    
                    return lista;
                }
            }
    
            private void CargarCamas(List<Cama> camas)
            {
    
               
                foreach (var cama in camas)
                {
    
    
                    System.Windows.Forms.Button buttonCama = new System.Windows.Forms.Button();
                    buttonCama.Location = new System.Drawing.Point(cama.PosicionX, cama.PosicionY);
                    buttonCama.Size = new System.Drawing.Size(60, 80);
                    buttonCama.TabIndex = 0;
                    buttonCama.Text = cama.DescripcionCama;
                    buttonCama.UseVisualStyleBackColor = true;
                    buttonCama.BackColor = cama.EstadoCama == 1 ? Color.Green: Color.Gray;
                    buttonCama.ForeColor = Color.Black;
                    Controls.Add(buttonCama);
    
                }
            }
    
            public class Cama
            {
                public int PosicionX { get; set; }
                public int PosicionY { get; set; }
                public string DescripcionCama { get; set; }
                public int EstadoCama { get; set; }
            }
        }
    }

    Saludos.



    • Editado Blueh Scouth viernes, 21 de septiembre de 2018 19:48
    viernes, 21 de septiembre de 2018 19:46
  • exelente, el codigo funciona muy bien, pero como hago para crear eventos a los botones? por ejemplo al darle click ver su estado o algo asi, ya seria lo ultimo.
    viernes, 21 de septiembre de 2018 20:05
  • Te actualizo el código.

    Si te das cuenta en la propiedad Tag del boton le seteo el Id Unico de la cama. Con ese Id puedes obtener la información que quieras, Actualizar en la Base de Datos, Eliminar. Etc. Porque recuerda que el formulario representa tu tabla.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WinCama
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                var camas = ObtenerCamas();
    
                CargarCamas(camas);
            }
    
            private List<Cama> ObtenerCamas()
            {
                using (SqlConnection cn = new SqlConnection("Data Source=.;Initial Catalog=BelcorpTest;Integrated Security=True"))
                {
                    var lista = new List<Cama>();
                    SqlCommand cmd = new SqlCommand("select * from Cama", cn);
                    cmd.CommandType = System.Data.CommandType.Text;
                    cn.Open();
                    var reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        lista.Add(new Cama
                        {
                            IdCama = Convert.ToInt32(reader["IdCama"]),
                            PosicionX = Convert.ToInt32(reader["PosicionX"]),
                            PosicionY = Convert.ToInt32(reader["PosicionY"]),
                            EstadoCama = Convert.ToInt32(reader["EstadoCama"]),
                            DescripcionCama = Convert.ToString(reader["DescripcionCama"])
                        });
                    }
    
                    return lista;
                }
            }
    
            private void CargarCamas(List<Cama> camas)
            {
    
               
                foreach (var cama in camas)
                {
    
    
                    System.Windows.Forms.Button buttonCama = new System.Windows.Forms.Button();
                    buttonCama.Location = new System.Drawing.Point(cama.PosicionX, cama.PosicionY);
                    buttonCama.Size = new System.Drawing.Size(60, 80);
                    buttonCama.TabIndex = 0;
                    buttonCama.Text = cama.DescripcionCama;
                    buttonCama.Tag = cama.IdCama;
                    buttonCama.Click += ButtonCama_Click;
                    buttonCama.UseVisualStyleBackColor = true;
                    buttonCama.BackColor = cama.EstadoCama == 1 ? Color.Green: Color.Gray;
                    buttonCama.ForeColor = Color.Black;
                    Controls.Add(buttonCama);
    
                }
            }
    
            private void ButtonCama_Click(object sender, EventArgs e)
            {
                var button = sender as Button;
                var idCama = button.Tag;
            }
    
            public class Cama
            {
                public int IdCama { get; set; }
                public int PosicionX { get; set; }
                public int PosicionY { get; set; }
                public string DescripcionCama { get; set; }
                public int EstadoCama { get; set; }
            }
        }
    }


    • Editado Blueh Scouth viernes, 21 de septiembre de 2018 20:16
    • Marcado como respuesta Henry_Dubon viernes, 21 de septiembre de 2018 20:34
    viernes, 21 de septiembre de 2018 20:13
  • Muchísimas Gracias amigo, es exactamente lo que buscaba, agradezco tu tiempo infinitamente.
    viernes, 21 de septiembre de 2018 20:34