[C#]Cambiar color Lista Botones

Iniciado por evicar, 19 Agosto 2010, 14:54 PM

0 Miembros y 1 Visitante están viendo este tema.

evicar

amigos les cuento estoy creando un formulario que contiene muchos botones cada boton es una localizacion en una rack de la bodega.. ej. tengo btn7h01, btn7h02, btn7h03 .. etc, btn6j01,btn6j02,btn6j05... etc

tengo una tabla en sql server con el nombre de LocalizacionBodega en esta tabla tengo columnas localizacion, producto,fechaingreso,fechaegreso,cantidad..

en mi aplicacion tengo listo el asunto de guardar en la tabla la ubicacion cuando se guarda un producto que bastaria con un update que guarde el boton que presiono(ej.btn7h06.) en la columna localizacion.


el asunto es que quiero que cuando se ocupe una ubicacion (btn7h06) cambie de color el boton (ej rojo). eso es relativamente facil cuando presiono el boton (btn7h06) cambia a color rojo. pero el problema es cuando reinicio la aplicacion no quedara guardado ese color.

entonces en el load del form tengo una Consulta sql que me arrojara todas las localizaciones ocupadas.... me arrojara como resultado el nombre de los botones ej: btn7h01,btn7h06,btn7j01.

entonces estos tres botones deberan cambiar de color..


en estos momentos estoy guardando el resultado de esa consulta en una List<string>
como puedo cambiar el color a una lista que contine n nombre de botones.


Código (csharp) [Seleccionar]

int m;
List<string> lista_nombres = new List<string>();
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "Data Source=xxxxxxxxxxx;Initial Catalog=SIVHOFMANN;User ID=xxxx";
cn.Open();
SqlDataAdapter ad = new SqlDataAdapter("select local=rtrim(localizacion) from localizacionproducto where producto<>''", cn);
DataSet ds = new DataSet();
ad.Fill(ds, "localizacionproducto");        

for (m = 0; (m < (ds.Tables[0].Rows.Count - 1)); m++)
{
      lista_nombres.Add(ds.Tables[0].Rows[m]["local"].ToString());
               
}

[D4N93R]

El control en donde están los botones (directamente el form, o un panel etc) tiene una propiedad llamada Controls, que es una collection de controles, ahí están todos, puedes hacer un foreach y probar si es Button algo asi: if(c is Button)  y haces lo que quieras dentro de esa condición.

Un saludo!

evicar

#2
Cita de: [D4N93R] en 19 Agosto 2010, 15:00 PM
El control en donde están los botones (directamente el form, o un panel etc) tiene una propiedad llamada Controls, que es una collection de controles, ahí están todos, puedes hacer un foreach y probar si es Button algo asi: if(c is Button)  y haces lo que quieras dentro de esa condición.

Un saludo!

en uno de mis intentos estoy recorriendo mi list<string> lista_nombre con un for me ro me dice que lista_nombres es un 'campo' pero se utiliza como metodo. como puedo solucionar esto o alguna otra idea para recorrer la lista.


Código (csharp) [Seleccionar]

for (int k = 0; (k <= (lista_nombres.Count - 1)); k++)
{
      this.Controls[lista_nombres(k)].BackColor = Color.Red;
}



saludos

evicar

logre hacer mi cometido pero en VB.net :( pero no es lo que quiero me gustaria pasarlo a C#


Imports System.Data.SqlClient

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Call Regresa_Nombres_Botones()
        For k As Integer = 0 To Regresa_Nombres_Botones.Count - 1
            Me.Controls(Regresa_Nombres_Botones(k)).BackColor = Color.Red
            Me.Controls(Regresa_Nombres_Botones(k)).Enabled = False

        Next


    End Sub

    Private Function Regresa_Nombres_Botones()
        Dim objConn As SqlConnection
        objConn = New SqlConnection("Data Source=xxxxxxxxxxxxxx;Initial Catalog=SIVHOFMANN;User ID=us")
        Dim m As Integer
        Dim Lista_Nombres As New List(Of String)

        Try
            objConn.Open()

            'Creo un Adapter
            Dim objAdapter As New SqlDataAdapter("select local=rtrim(localizacion) from localizacionproducto where producto<>''", objConn)
            'Creo un DataSet
            Dim objDataSet As New DataSet

            'Lleno el DataSet con la Tabla
            objAdapter.Fill(objDataSet, "localizacionproducto")

            'Recorro la tabla para ver que no exista un registro con el mismo nombre
            For m = 0 To objDataSet.Tables(0).Rows.Count - 1
                Lista_Nombres.Add(objDataSet.Tables(0).Rows(m).Item("local"))
            Next

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
            objConn.Close()
        End Try

        Return Lista_Nombres


    End Function


    Private Sub btn7h1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn7h1.Click

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGrabar.Click

        Dim objConn As SqlConnection
        objConn = New SqlConnection("Data Source=xxxxxxxxxxxxxxxxx;Initial Catalog=SIVHOFMANN;User ID=us")
        Try
            objConn.Open()
            Dim objcomand3 As New SqlCommand("insert into localizacionproducto (producto,localizacion) values ('" + txtproducto.Text + "' ,'" + txtlocalizacion.Text + "')", objConn)
            objcomand3.ExecuteNonQuery()
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
            objConn.Close()
        End Try

        Call Regresa_Nombres_Botones()
        For k As Integer = 0 To Regresa_Nombres_Botones.Count - 1
            Me.Controls(Regresa_Nombres_Botones(k)).BackColor = Color.Red
        Next

    End Sub



no se si me podrian ayudar a transformat a c# esta rutina

  Private Function Regresa_Nombres_Botones()
        Dim objConn As SqlConnection
        objConn = New SqlConnection("Data Source=xxxxxxxxxxxxxx;Initial Catalog=SIVHOFMANN;User ID=us")
        Dim m As Integer
        Dim Lista_Nombres As New List(Of String)

        Try
            objConn.Open()

            'Creo un Adapter
            Dim objAdapter As New SqlDataAdapter("select local=rtrim(localizacion) from localizacionproducto where producto<>''", objConn)
            'Creo un DataSet
            Dim objDataSet As New DataSet

            'Lleno el DataSet con la Tabla
            objAdapter.Fill(objDataSet, "localizacionproducto")

            'Recorro la tabla para ver que no exista un registro con el mismo nombre
            For m = 0 To objDataSet.Tables(0).Rows.Count - 1
                Lista_Nombres.Add(objDataSet.Tables(0).Rows(m).Item("local"))
            Next

        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "Error")
            objConn.Close()
        End Try

        Return Lista_Nombres


    End Function


e ocupado esta pagina http://www.carlosag.net/Tools/CodeTranslator/ para transforma el codigo pero me lo da con muchos errores... sobre todo con el return


saludos


[D4N93R]


Código (csharp) [Seleccionar]
private List<string> Regresa_Nombres_Botones()

Tte da error porque el traductor ese le pone void en vez de List<string> en el tipo de retorno..

Un saludo! pasa lo mismo con el otro código.

evicar

Cita de: [D4N93R] en 19 Agosto 2010, 21:42 PM

Código (csharp) [Seleccionar]
private List<string> Regresa_Nombres_Botones()

Tte da error porque el traductor ese le pone void en vez de List<string> en el tipo de retorno..

Un saludo! pasa lo mismo con el otro código.

eso ya lo tenia mas o menos solucionado te presento mi codigo en c#

        private void Form1_Load(object sender, EventArgs e)
        {
            Regresa_Nombres_Botones();
            for (int k = 0; (k <= (Regresa_Nombres_Botones.Count - 1)); k++)
            {
                this.Controls[Regresa_Nombres_Botones(k)].BackColor = Color.Red;
                this.Controls[Regresa_Nombres_Botones(k)].Enabled = false;
            }
           
           
         }

 



        private List<string> Regresa_Nombres_Botones()
        {
           
            SqlConnection cn = new SqlConnection();
            cn.ConnectionString = "Data Source=200.119.240.243;Initial Catalog=SIVHOFMANN;User ID=us";
            List<string> lista_nombres = new List<string>();
           
            try
            {
                cn.Open();
                SqlDataAdapter ad = new SqlDataAdapter("select local=rtrim(localizacion) from localizacionproducto where producto<>''", cn);
                DataSet ds = new DataSet();
                ad.Fill(ds, "localizacionproducto");
                for (int m = 0; (m < (ds.Tables[0].Rows.Count - 1)); m++)
                {
                    lista_nombres.Add(ds.Tables[0].Rows[m]["local"].ToString());

                }
            }
            catch (Exception ex)
            {
               
               
            }

            return lista_nombres;
           
        }



ahora mi problema surge en el for en el evento load del form

        private void Form1_Load(object sender, EventArgs e)
        {
            Regresa_Nombres_Botones();
            for (int k = 0; (k <= (Regresa_Nombres_Botones.Count - 1)); k++)
            {
                this.Controls[Regresa_Nombres_Botones(k)].BackColor = Color.Red;
                this.Controls[Regresa_Nombres_Botones(k)].Enabled = false;
            }
           
           
         }


en vb.net es super siple llamar el regresa_nombres_botones pero en c# que es lo que tengo mal????.


saludos.


evicar

SOLUCIONADO.... xD



           Regresa_Nombres_Botones();
            for (int k = 0; (k <= (Regresa_Nombres_Botones().Count - 1)); k++)
            {
                this.Controls[Regresa_Nombres_Botones()[k]].BackColor = Color.Red;
                this.Controls[Regresa_Nombres_Botones()[k]].Enabled = false;
            }

[D4N93R]

Excelente!

PD: Aparte de poner los códigos entre [code][/code] ponle el languaje:

[code=csharp][/code] :) De esa fomra ayuda un poco más a leer el code.

Saludos!

evicar

Amigos estoy en la parte final de mi proyecto.

les adjunto un pantallazo de mi aplicacion.


Uploaded with ImageShack.us

el tema es el siguiente en el textbox ubicacion al momento de precionar un boton de la parte superior me imprime en el textbox en name del boton. el tema es el siguiente cuando presione el boton quiero que cambie de color y al presionar otro boton quiero que vuelva a el color por defecto(color.control)

al presionar un boton que se cambie de color se que es facil button.backcolor = color.red;

pero como puedo hacer que el botton que ya cambio de color vuelva a su color por defecto

el evento Enter (button.backcorlor=color.red) y  leave(button.backcolor=color.control) no me sirven porque cuando me muevo a un textbox se produce el evento leave

Tendria que encontrar alguna forma de que los bottones de la parte superior no pertenescan al form y asi el eveto enter y leavel sean parte solamente de ese sector de bottones