none
hacer un select utilizando variables desde c# RRS feed

  • Pregunta

  • Buenas noches amigos, tengo un problema si me pueden ayudar, tengo un formulario donde tengo varios botones y un datagrid donde se muestran los datos, la idea es que cuando yo presiono el botón 1 en el datagrid me aparecen lo registros con con el numero 1 lo que quiero es que si presiono el botón 3 deben aparecer en el datagrid los registros con el numero 1 y con el numero  3 y si presiono el botón 2 como no hay datos en el tabla solo deben aparecer los registros del 1 y 3, y así sucesivamente, el hecho es que si presiono cualquier botón que tenga información aparezcan según voy presionado, osea que se aparezcan los registros que presiono según los botones  

    aquí hago la conexión 

     Libreria.CBD cad = new Libreria.CBD();
                SqlConnection con = new SqlConnection(cad.StringConDB());
                SqlCommand CmdUsuario = new SqlCommand("sp_tratamientos_ver", con);
                CmdUsuario.CommandType = CommandType.StoredProcedure;
                CmdUsuario.Parameters.AddWithValue("@codigousuario", _codigousuario);
                CmdUsuario.Parameters.AddWithValue("@codigodiente", ((Button)sender).Text);
                try
                {
                    SqlDataAdapter ad = new SqlDataAdapter(CmdUsuario);
                    DataTable dt = new DataTable();
                    dt.Clear();
                    ad.Fill(dt);
                    _verhistoria.DataSource = dt;
                    datahistoria.DataSource = _verhistoria;
                    datahistoria.AutoResizeColumns();
    
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    con.Dispose();
                    CmdUsuario.Dispose();
                }

    el sp lo hago asi 

    ALTER procedure [dbo].[sp_tratamientos_ver]
    @codigousuario varchar(50),
    @codigodiente varchar(50)
    as 
    select
    codigodiente as [Codigo],
    fecha as [Fecha],
    descripcion as [Descripcion],
    codigo as [Codigodiente]
    from tratamientos
    where codigousuario = @codigousuario and codigodiente IN (@codigodiente)

    por favor como lo hago gracias

     
    sábado, 6 de abril de 2019 5:15

Respuestas

  • Hola Israel Martin Vargas Torres:

    No lo veo nada claro, que puedas llamar a un botón con un igual.

    No obstante te voy a dar una solución fácil.

    Lo primero, cambia los botones por checkbox con apariencia botón.

    Segundo paso, crea un control de tipo groupBox y mete los controles dentro. Le puedes quitar el text y apariencia para que no sea visible

    Luego creas un método y asignas el evento click de los chkBox apariencia botón a este método (yo lo he llamado cambiar)

            private void cambiar(object sender, EventArgs e)
            {
                StringBuilder sb = new StringBuilder();
    
                foreach (Control c in groupBox1.Controls)
                {
                    if (c is CheckBox)
                    {
                        CheckBox chk = (CheckBox)c;
                        if (chk.Checked)
                        {
    
                            sb.Append("," + chk.Name.Substring(8, (chk.Name.Length - 8)));
                        }
                    }
                }
                llenarDatos(sb.ToString());
            }
    
            private void llenarDatos(string @dientes)
            {
                /* no ejecuto este método si dientes no tiene contenido*/
                if (String.IsNullOrEmpty(dientes))
                    return;
                //elimino la primera coma.
                string @codigoDiente = @dientes.Substring(1, (dientes.Length - 1));
                string @codigoUsuario = "1";
    
                try
                {
                    /* aqui dispongo mi conexion a la base de datos */
                    var ConnectionString = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=foros;Server=ESQUINERO";
                    DataTable dt = new DataTable();
    
                    using (SqlConnection connection = new SqlConnection(ConnectionString))
                    {
                        //Inicializa el comando que se va a ejecutar
                        using (SqlCommand cmd = new SqlCommand("sp_tratamientos_ver", connection))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
    
                            //Se agregan los parámetros
                            //cmd.Parameters.AddWithValue("@PKEY", PKEY);
                            cmd.Parameters.Add("@codigoUsuario", System.Data.SqlDbType.VarChar, 50).Value = @codigoUsuario;
                            cmd.Parameters.Add("@codigoDiente", System.Data.SqlDbType.VarChar, 50).Value = @codigoDiente;
    
                            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                            {
    
                                //Se abre la conexión
                                /*cmd.CommandTimeout = 900000;*/
                                cmd.Connection.Open();
                                //Se cargan los datos en el DataTable
                                da.Fill(dt);
    
                                _verhistoria.DataSource = dt;
    
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Notificación de excepcion por: " + ex.Message);
                }
            }
    

    Resultado

    jueves, 18 de abril de 2019 9:42
  • Hola Israel Martín Vargas Torres:

    Revisando tú código veo esto:

    en el Button 18 tienes 

    Button btn1 = (Button)sender;
                _codigodiente = ((Button)sender).Text;
                MessageBox.Show(""+_codigodiente);

    Código que no veo en el resto de botones.

    Ahora bien, se supone que _codigodiente es una variable del formulario donde estas, que es la que llamas en el método que va a buscar datos al sql server.

    Supongo que todos los botones, que corresponden a los dientes, deberían de trabajar esta variable, porque sino, no cambia.

    Pero además te diré que no esta bien. Si mi planteamiento es correcto, cuando pulsas el botón, solo cuando tienes la causística de que es verde tendrá que añadir a esa variable el diente afectado.

    _codigodiente += ","+((Button)sender).Text;

    y cuando es en el color de desactivar, eliminarlo. 

    _codigodiente = _codigodiente.Replace((","+((Button)sender).Text),"");

    Observa que te he puesto un += que quiere decir, sobre lo que tengo, le añado.

    El código esta implementado al vuelo, sobre la idea que creo que utilizas. No se ha verificado.

    Ya comentas


    viernes, 26 de abril de 2019 4:53
  • De nada Israel.

    Una sola anotación, por el bien del foro y de las respuestas, la que tienes que marcar como respuesta no es la tuya sino la mía que te ha dado la solución, ya que otros usuarios, dentro de un tiempo, si tienen o siguen este hilo, ven primero, la pregunta, luego la respuesta que has marcado como correcta, y a partir de ahí, una secuencia de las preguntas y respuestas.

    Si la respuesta no fue del todo acertada, pero te ayudó, entonces, marcas un voto útil en la parte izquierda donde pone votar, y con eso queda como ayuda, pero no como respuesta, ya que esto pervive en el tiempo y se pierde un poco la idea.

    jueves, 2 de mayo de 2019 5:02
  • Muy buenas noches, en verdad eres una gran persona, sirvio mucho tu ayuda ya lo probe y si esta funcionando esta conforme en verdad muchas muchas gracias, en verdad muchas gracias.
    jueves, 2 de mayo de 2019 4:50

Todas las respuestas

  • Hola Israel Martin Vargas Torres:

    Puedes hacerlo de este modo:

    CREATE TABLE tratamientos (codigodiente VARCHAR(100) , fecha DATE , descripcion VARCHAR(100) , codigo INT , codigousuario VARCHAR(50) ); GO INSERT INTO tratamientos (codigodiente , fecha , descripcion , codigo , codigousuario ) VALUES ('1', '20190101', 'a', 1, '1'),
    ('2', '20190101', 'b', 2, '1'),
    ('3', '20190101', 'c', 3, '1'),
    ('4', '20190101', 'd', 4, '1'),
    ('5', '20190101', 'e', 5, '1'),
    ('6', '20190101', 'f', 6, '1'),
    ('7', '20190101', 'a1', 7, '1'),
    ('9', '20190101', 'a3', 9, '1'),
    ('8', '20190101', 'a2', 8, '1'),
    ('10', '20190101', 'z', 10,'1'); GO CREATE PROCEDURE dbo.sp_Tratamientos_Ver (@codigousuario VARCHAR(50) , @codigoDiente VARCHAR(50) ) AS SELECT codigodiente AS [Codigo] , fecha AS [Fecha] , descripcion AS [Descripcion] , codigo AS [Codigodiente] FROM tratamientos t INNER JOIN ( SELECT value FROM STRING_SPLIT(@codigoDiente, ',') ) AS v ON v.value = t.codigo

        WHERE codigousuario = @codigousuario; RETURN; GO

    Utilizando string_split que te devuelve en filas lo que llegue como un solo string, en este caso @codigoCliente, por el separador, esto, lo cruzas con el t.codigo, y solo devuelve los que lleguen en @codigoCliente.

    Cuando llamas a los botones, chequeas cuantos estan pulsados y formas @codigoCliente, por los botones pulsados.

    Si no tienes sql Server 2016, no te funcionará porque la función string_split se creo en esa versión, entonces, tienes que adaptar el código.

    Procedimiento 2 con xml

    CREATE PROCEDURE dbo.sp_Tratamientos_Ver2 (
     @codigousuario VARCHAR(50),
     @codigoDiente  VARCHAR(50)
     )
     AS
    
     
    DECLARE @X xml
    SELECT @X = CONVERT(xml,'<r><s>' + REPLACE(@codigoDiente,',','</s><s>') + '</s></r>')
    	SELECT codigodiente AS [Codigo]
    		, fecha AS [Fecha]
    		, descripcion AS [Descripcion]
    		, codigo AS [Codigodiente]
    	FROM   
    		tratamientos t
    			INNER JOIN
    	(
    	SELECT (T.c.value('.','varchar(max)')) AS Value
    		FROM @X.nodes('/r/s') T(c) 
    	) AS v ON v.VALUE = t.codigo
    
    	WHERE codigousuario = @codigousuario
    
    RETURN

    Ejecución desde la capa sql de cualquiera de los dos procedures.

    exec dbo.sp_Tratamientos_Ver2 '1','4,5,6'

    exec dbo.sp_Tratamientos_Ver '1','1,2,3'


    • Propuesto como respuesta Carlos_Ruiz_M lunes, 8 de abril de 2019 14:39
    sábado, 6 de abril de 2019 7:47
  • hola

    El tema es que el IN no soporta parametros, sino que debes conctenar lo valores por lo que vas a filtrar, esto implica realizar un query dinamico en un string dentro del procedure, concatenar estos valor y usar el EXEC para ejeuctar el string que SELECT que armaste

    Personalmente recomendaria paes una lista de valores usando

    Parámetros con valores de tabla

    quizas puede parecer algo un poco mas completicad porque tienes que definir un type en la db, pero dentro del procedure podras usar el INNER JOIN con el campo para filtrar, es mas con este si podrias usar el IN porque en definitiva el parametro se ve como una tabla dinamica

    Analiza el articulo se explica muy simple y creo puede servirte para muchos casos donde tengas que pasar listas con varios datos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Propuesto como respuesta Carlos_Ruiz_M lunes, 8 de abril de 2019 14:39
    sábado, 6 de abril de 2019 14:37
  • maestro buenas noches , pero no puedo llegar hacer funcionar como puedo hacer lo que hago es asi 

    #region para ver las actas
                Libreria.CBD cad = new Libreria.CBD();
                SqlConnection con = new SqlConnection(cad.StringConDB());
                SqlCommand CmdUsuario = new SqlCommand("sp_tratamientos_ver", con);
                CmdUsuario.CommandType = CommandType.StoredProcedure;
                CmdUsuario.Parameters.AddWithValue("@codigousuario", _codigo);
                CmdUsuario.Parameters.AddWithValue("@codigodiente", "11,18,12");
                try
                {
                    SqlDataAdapter ad = new SqlDataAdapter(CmdUsuario);
                    DataTable dt = new DataTable();
                    dt.Clear();
                    ad.Fill(dt);
                    _verhistoria.DataSource = dt;
                    datahistoria.DataSource = _verhistoria;
                    datahistoria.AutoResizeColumns();

                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    con.Dispose();
                    CmdUsuario.Dispose();
                }
                #endregion

    pero aun asi no sale me podrias ayudar por favor gracias 

    miércoles, 17 de abril de 2019 4:54
  • Hola Israel Martín Vargas Torres:

    Pero aun así no me sale

    Es muy poco explícito. Genera un error??? Cual??? Donde????

    He intentado reproducir tu caso casi al completo. Te voy a poner todo el código adaptado al tuyo para intentar hacerlo funcionar, pero tienes que ser mucho más claro en la definición de lo que ocurre.

    Voy a volver a crear las tablas en SQL y me voy a decantar por un procedimiento, el del XML.

    drop table if exists dbo.tratamientos; /* sentencia valida para 2016 */
    
    CREATE TABLE tratamientos
    (codigodiente  VARCHAR(100)
    , fecha         DATE
    , descripcion   VARCHAR(100)
    , codigo        INT
    , codigousuario VARCHAR(50)
    );
    GO
    
    INSERT INTO tratamientos
    (
      codigodiente
    , fecha
    , descripcion
    , codigo
    , codigousuario
    )
    VALUES
    /*2 usuarios 10 dientes por cada*/
    ('1', '20190101', 'a', 1, '1'),
    ('2', '20190101', 'b', 2, '1'),
    ('3', '20190101', 'c', 3, '1'),
    ('4', '20190101', 'd', 4, '1'),
    ('5', '20190101', 'e', 5, '1'),
    ('6', '20190101', 'f', 6, '1'),
    ('7', '20190101', 'a1', 7, '1'),
    ('9', '20190101', 'a3', 9, '1'),
    ('8', '20190101', 'a2', 8, '1'),
    ('10', '20190101', 'z', 10,'1'),
    ('1', '20190101', 'a',  1, '1'), /*esta duplicado*/
    ('2', '20190101', 'b',  2, '2'),
    ('3', '20190101', 'c',  3, '2'),
    ('4', '20190101', 'd',  4, '2'),
    ('5', '20190101', 'e',  5, '2'),
    ('6', '20190101', 'f',  6, '2'),
    ('7', '20190101', 'a1', 7, '2'),
    ('9', '20190101', 'a3', 9, '2'),
    ('8', '20190101', 'a2', 8, '2'),
    ('10', '20190101', 'z', 10,'2');
    GO
    
     

    Tabla creada, con 2 usuarios. (1,2) y 10 dientes por cada.

    Procedure

    CREATE or ALTER PROCEDURE dbo.sp_Tratamientos_Ver (
    /*VALIDO EN SQL 2016, SI ES ANTERIOR, SUSTITUIR POR UN CREATE 
    Y SI DA ERROR POR UN ALTER O ELIMINAR PRIMERO Y CREAR */
     @codigousuario VARCHAR(50),
     @codigoDiente  VARCHAR(50)
     )
     AS
    
     
    DECLARE @X xml
    SELECT @X = CONVERT(xml,'<r><s>' + REPLACE(@codigoDiente,',','</s><s>') + '</s></r>')
    	SELECT codigodiente AS [Codigo]
    		, fecha AS [Fecha]
    		, descripcion AS [Descripcion]
    		, codigo AS [Codigodiente]
    	FROM   
    		tratamientos t
    			INNER JOIN
    	(
    	SELECT (T.c.value('.','varchar(max)')) AS Value
    		FROM @X.nodes('/r/s') T(c) 
    	) AS v ON v.VALUE = t.codigo
    
    	WHERE codigoUsuario = @codigousuario
    
    RETURN

    Verifico que en SQL me funciona correctamente:

    exec sp_Tratamientos_Ver '1','1,3'

    Salida

    Me devuelve los registros solicitados, incluido el duplicado que inserté por error.

    Siguiente Fase c#

    Tengo en mi WindowsForms un dataGridView llamado _verhistoria.

    Un botón, y en la llamada al botón.

    private void btnLlenar_Click(object sender, EventArgs e)
            {
    
                string @codigoDiente = "1,3,6";
                string @codigoUsuario = "1";
    
                try
                {
                    /* aqui dispongo mi conexion a la base de datos */
                    var ConnectionString = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=foros;Server=ESQUINERO";
                    DataTable dt = new DataTable();
    
                    using (SqlConnection connection = new SqlConnection(ConnectionString))
                    {
                        //Inicializa el comando que se va a ejecutar
                        using (SqlCommand cmd = new SqlCommand("sp_tratamientos_ver", connection))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
    
                            //Se agregan los parámetros
                            //cmd.Parameters.AddWithValue("@PKEY", PKEY);
                            cmd.Parameters.Add("@codigoUsuario", System.Data.SqlDbType.VarChar, 50).Value = @codigoUsuario;
                            cmd.Parameters.Add("@codigoDiente", System.Data.SqlDbType.VarChar, 50).Value = @codigoDiente;
    
                            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                            {
    
                                //Se abre la conexión
                                /*cmd.CommandTimeout = 900000;*/
                                cmd.Connection.Open();
                                //Se cargan los datos en el DataTable
                                da.Fill(dt);
    
                                _verhistoria.DataSource = dt;
    
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Notificación de excepcion por: " + ex.Message);
                }
            }
           

    Observa que en el código yo defino que quiero para el datagridview los dientes 1, 3, 6 del usuario 1

    Salida

    Mi rejilla tiene los dientes 1, 3 y 6 del usuario 1 y la fila repetida.

    Espero te ayude

    • Propuesto como respuesta Carlos_Ruiz_M viernes, 26 de abril de 2019 14:45
    jueves, 18 de abril de 2019 4:26
  • maestro muchas gracias ahora si ya lo hice correr sino que hubo un problema con los campos solo hay un pequenito problemita el cual paso a explicarte espero que me entiendas, el problema es como le doy al campo string @codigoDiente = "1,3,6"; la historia es asi son 5 botones que tienen name el boton 1 = 1, boton 2 = 2, boton 3 = 3, boton 4 = 4, boton 5 = 5 como puedo hacer para que el @codigoDiente alamacene los valores de los botones y se pueda correr en C# osea si presiono el boton 1 @codigoDiente "1", y si le sigo presionando el boton 3, el @codigoDiente = "1,3" y asi sucesivamente depende de la cantidad de numeros porque la verdad es que son 58 botones yo podria selecionar 10 botones y el codigo debe alamcenar los botones que he  precionado gracias maestro espero tu ayuda  

    jueves, 18 de abril de 2019 5:32
  • Hola Israel Martin Vargas Torres:

    No lo veo nada claro, que puedas llamar a un botón con un igual.

    No obstante te voy a dar una solución fácil.

    Lo primero, cambia los botones por checkbox con apariencia botón.

    Segundo paso, crea un control de tipo groupBox y mete los controles dentro. Le puedes quitar el text y apariencia para que no sea visible

    Luego creas un método y asignas el evento click de los chkBox apariencia botón a este método (yo lo he llamado cambiar)

            private void cambiar(object sender, EventArgs e)
            {
                StringBuilder sb = new StringBuilder();
    
                foreach (Control c in groupBox1.Controls)
                {
                    if (c is CheckBox)
                    {
                        CheckBox chk = (CheckBox)c;
                        if (chk.Checked)
                        {
    
                            sb.Append("," + chk.Name.Substring(8, (chk.Name.Length - 8)));
                        }
                    }
                }
                llenarDatos(sb.ToString());
            }
    
            private void llenarDatos(string @dientes)
            {
                /* no ejecuto este método si dientes no tiene contenido*/
                if (String.IsNullOrEmpty(dientes))
                    return;
                //elimino la primera coma.
                string @codigoDiente = @dientes.Substring(1, (dientes.Length - 1));
                string @codigoUsuario = "1";
    
                try
                {
                    /* aqui dispongo mi conexion a la base de datos */
                    var ConnectionString = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=foros;Server=ESQUINERO";
                    DataTable dt = new DataTable();
    
                    using (SqlConnection connection = new SqlConnection(ConnectionString))
                    {
                        //Inicializa el comando que se va a ejecutar
                        using (SqlCommand cmd = new SqlCommand("sp_tratamientos_ver", connection))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
    
                            //Se agregan los parámetros
                            //cmd.Parameters.AddWithValue("@PKEY", PKEY);
                            cmd.Parameters.Add("@codigoUsuario", System.Data.SqlDbType.VarChar, 50).Value = @codigoUsuario;
                            cmd.Parameters.Add("@codigoDiente", System.Data.SqlDbType.VarChar, 50).Value = @codigoDiente;
    
                            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                            {
    
                                //Se abre la conexión
                                /*cmd.CommandTimeout = 900000;*/
                                cmd.Connection.Open();
                                //Se cargan los datos en el DataTable
                                da.Fill(dt);
    
                                _verhistoria.DataSource = dt;
    
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Notificación de excepcion por: " + ex.Message);
                }
            }
    

    Resultado

    jueves, 18 de abril de 2019 9:42
  • hola amigo muchas gracias por la ayuda pero me he perdido, te pongo las capturas de mi programa es de la siguiente forma 

    

    en ese recuadro veo a los usuarios cuando le doy clik me aparece la siguiente ventana 

    como se puede apreciar los botones que estan de color amarillo son lo que tienen datos (historia) si presiono el boton nro 18 me aparece su historia clinica en el lado derecho como se muestra en el siguiente cuadro 

    el boton se convirtió de color verde y así pasa con cualquier de boton que presionan asi :

    alli presione los botones 18 14 11 pero como se puede apreciar no sale la historia de los otros botones, la idea esta como los botones que presiono se vuelven en verde y debe salir su historia en el costado 

    alli volvi a presionar el boton 14 y se volvió a su estado original en el caso de que no tenga historia se volverá al color gris, bueno eso ya lo tengo resuelto, pero la idea es que cuando presiono cualquier botón salga su historia en el cuadro del costado y si lo vuelvo a presionar debe desaparecer los datos del boton presionado, solo debe quedar los datos de los que esta en verde, si presionio cualquier otro boton debe mostrar la historia de todos los que se conviertan en verde 

    el codigo que utilizo para mostrar las historias es este 

            private void historiadientes()
            {
                #region para ver las actas
                Libreria.CBD cad = new Libreria.CBD();
                SqlConnection con = new SqlConnection(cad.StringConDB());
                SqlCommand CmdUsuario = new SqlCommand("sp_tratamientos_ver", con);
                CmdUsuario.CommandType = CommandType.StoredProcedure;
                CmdUsuario.Parameters.Add("@codigousuario", System.Data.SqlDbType.VarChar, 50).Value = _codigousuario;
                CmdUsuario.Parameters.Add("@codigodiente", System.Data.SqlDbType.VarChar, 50).Value = _codigodiente; 

                try
                {
                    SqlDataAdapter ad = new SqlDataAdapter(CmdUsuario);
                    DataTable dt = new DataTable();
                    dt.Clear();
                    ad.Fill(dt);
                    _verhistoria.DataSource = dt;
                    datahistoria.DataSource = _verhistoria;
                    datahistoria.AutoResizeColumns();

                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    con.Dispose();
                    CmdUsuario.Dispose();
                }
                #endregion
            }
     

    y cada boton tiene el mismo codigo pongo un ejemplo de los primeros botones para no cargar mucho 

            private void b11_Click(object sender, EventArgs e)
            {
                #region detaboton
                Button btn1 = (Button)sender;

             if (btn1.BackColor == Color.Green)
                {
                    historiadientes();
                 _estado = 2;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    colordiente();
                    if (datadientescolor.RowCount == 0)
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.FromName("control");
                    }
                    else
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.Yellow;
                    }
                }
                else
                {
                    _estado = 1;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    Button btn = (Button)sender;
                    btn.BackColor = Color.Green;
                }
                #endregion
            }
            private void b12_Click(object sender, EventArgs e)
            {
                #region detaboton
                Button btn1 = (Button)sender;
                if (btn1.BackColor == Color.Green)
                {
                    _estado = 2;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    colordiente();
                    if (datadientescolor.RowCount == 0)
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.FromName("control");
                    }
                    else
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.Yellow;
                    }
                }
                else
                {
                    _estado = 1;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    Button btn = (Button)sender;
                    btn.BackColor = Color.Green;
                }
                #endregion
            }
            private void b13_Click(object sender, EventArgs e)
            {
                #region detaboton
                Button btn1 = (Button)sender;
                if (btn1.BackColor == Color.Green)
                {
                    _estado = 2;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    colordiente();
                    if (datadientescolor.RowCount == 0)
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.FromName("control");
                    }
                    else
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.Yellow;
                    }
                }
                else
                {
                    _estado = 1;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    Button btn = (Button)sender;
                    btn.BackColor = Color.Green;
                }
                #endregion
            }
            private void b14_Click(object sender, EventArgs e)
            {
                #region detaboton
                Button btn1 = (Button)sender;
                if (btn1.BackColor == Color.Green)
                {
                    _estado = 2;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    colordiente();
                    if (datadientescolor.RowCount == 0)
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.FromName("control");
                    }
                    else
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.Yellow;
                    }
                }
                else
                {
                    _estado = 1;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    Button btn = (Button)sender;
                    btn.BackColor = Color.Green;
                }
                #endregion
            }
            private void b15_Click(object sender, EventArgs e)
            {
                #region detaboton
                Button btn1 = (Button)sender;
                if (btn1.BackColor == Color.Green)
                {
                    _estado = 2;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    colordiente();
                    if (datadientescolor.RowCount == 0)
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.FromName("control");
                    }
                    else
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.Yellow;
                    }
                }
                else
                {
                    _estado = 1;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    Button btn = (Button)sender;
                    btn.BackColor = Color.Green;
                }
                #endregion
            }
            private void b16_Click(object sender, EventArgs e)
            {
                #region detaboton
                Button btn1 = (Button)sender;
                if (btn1.BackColor == Color.Green)
                {
                    _estado = 2;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    colordiente();
                    if (datadientescolor.RowCount == 0)
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.FromName("control");
                    }
                    else
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.Yellow;
                    }
                }
                else
                {
                    _estado = 1;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    Button btn = (Button)sender;
                    btn.BackColor = Color.Green;
                }
                #endregion
            }
            private void b17_Click(object sender, EventArgs e)
            {
                #region detaboton
                Button btn1 = (Button)sender;
                if (btn1.BackColor == Color.Green)
                {
                    _estado = 2;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    colordiente();
                    if (datadientescolor.RowCount == 0)
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.FromName("control");
                    }
                    else
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.Yellow;
                    }
                }
                else
                {
                    _estado = 1;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    Button btn = (Button)sender;
                    btn.BackColor = Color.Green;
                }
                #endregion
            }
            private void b18_Click(object sender, EventArgs e)
            {
                
                #region detaboton
                Button btn1 = (Button)sender;
                _codigodiente = ((Button)sender).Text;
                MessageBox.Show(""+_codigodiente);
                historiadientes();
                if (btn1.BackColor == Color.Green)
                {
                    _estado = 2;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    colordiente();
                    if (datadientescolor.RowCount == 0)
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.FromName("control");
                    }
                    else
                    {
                        Button btn = (Button)sender;
                        btn.BackColor = Color.Yellow;
                    }
                }
                else
                {
                    _estado = 1;
                    _boton = ((Button)sender).Text;
                    _dientetemporal();
                    Button btn = (Button)sender;
                    btn.BackColor = Color.Green;
                }
                #endregion
            }

    lo que quiero por favor es que si presiono el boton debe salir segun el boton que presiono gracias por tu ayuda; en el boton que dice buttun 1 es el proceso que le doy para ingresar sus datos que ya lo tengo resuelto espero tu ayuda gracias  

    martes, 23 de abril de 2019 6:01
  • Hola Israel Martin Vargas Torres

    ¿Qué IDE estás usando has probado de las características de Visual Studio para depurar?

    He conocido que anteriormente cualquiera que se llamara programador depuraba su propio código.

    En los foros de MSDN por la cantidad de solicitudes no, no es posible revisar o debuggear código ajeno y personalizado. 

    Te recomiendo buscar en la galería de scripts de TechNet quizá alguien ya haya desarrollado lo que tu intentas hacer. O consultar recursos de diseño o UEX

    Debido a que no hemos recibido alguna notificación que aún se esté presentando el problema que enuncias en tu consulta  y que la respuesta provista provee un amplio panorama y campo de acción sobre tu duda; vamos a considerar tu duda como resuelta debido a la respuesta apropiada proporcionada  y así proceder a calificar las misma como respuesta.

    No dudes en ampliar más sobre este tema si es que aún lo requirieras o de abrir una nueva consulta en caso de tener alguna situación o necesitarla con algún otro de los productos de Microsoft.

     

    Adicional le invito a consultar los siguientes recursos:

    Guia para formular preguntas en el foro

    Channel 9 - donde puedes encontrar una sección de: C#

     

    Gracias por usar los foros de TechNet.

    Erick Rivera

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.



    • Editado eRiver1 jueves, 25 de abril de 2019 18:49 Gramatica
    • Propuesto como respuesta Carlos_Ruiz_M viernes, 26 de abril de 2019 14:45
    jueves, 25 de abril de 2019 18:45
  • Buenas tardes Erick Disculpa mi ignorancia pero tu comentario de "He conocido que anteriormente cualquiera que se llamara programador depuraba su propio código." no lo entiendo muy bien, el ser ignorante o el no saber no tiene nada de malo mas bien uno quiere aprender lo que no pudo entender en su momento; mas bien estoy muy agradecido con Javi Fernández F. que se ha tomado la molestia de enseñarme muchas cosas que estoy aprendiendo, son personas como Javier que  incentivan a uno a seguir trabajando, y si he cometido error en publicar es porque es mi forma de explicarme mil disculpas si he errado. Gracias 

    PD. quiero terminar este mensaje con : "Se mide la inteligencia de un individuo por la cantidad de incertidumbres que es capaz de soportar (Immanuel Kant)"

    Espero que javier por favor me siga ayudando o cualquier otra persona que me pueda aportar con mas ideas gracias 

    viernes, 26 de abril de 2019 2:58
  • Hola Israel Martín Vargas Torres:

    Revisando tú código veo esto:

    en el Button 18 tienes 

    Button btn1 = (Button)sender;
                _codigodiente = ((Button)sender).Text;
                MessageBox.Show(""+_codigodiente);

    Código que no veo en el resto de botones.

    Ahora bien, se supone que _codigodiente es una variable del formulario donde estas, que es la que llamas en el método que va a buscar datos al sql server.

    Supongo que todos los botones, que corresponden a los dientes, deberían de trabajar esta variable, porque sino, no cambia.

    Pero además te diré que no esta bien. Si mi planteamiento es correcto, cuando pulsas el botón, solo cuando tienes la causística de que es verde tendrá que añadir a esa variable el diente afectado.

    _codigodiente += ","+((Button)sender).Text;

    y cuando es en el color de desactivar, eliminarlo. 

    _codigodiente = _codigodiente.Replace((","+((Button)sender).Text),"");

    Observa que te he puesto un += que quiere decir, sobre lo que tengo, le añado.

    El código esta implementado al vuelo, sobre la idea que creo que utilizas. No se ha verificado.

    Ya comentas


    viernes, 26 de abril de 2019 4:53
  • Muy buenas noches, en verdad eres una gran persona, sirvio mucho tu ayuda ya lo probe y si esta funcionando esta conforme en verdad muchas muchas gracias, en verdad muchas gracias.
    jueves, 2 de mayo de 2019 4:50
  • De nada Israel.

    Una sola anotación, por el bien del foro y de las respuestas, la que tienes que marcar como respuesta no es la tuya sino la mía que te ha dado la solución, ya que otros usuarios, dentro de un tiempo, si tienen o siguen este hilo, ven primero, la pregunta, luego la respuesta que has marcado como correcta, y a partir de ahí, una secuencia de las preguntas y respuestas.

    Si la respuesta no fue del todo acertada, pero te ayudó, entonces, marcas un voto útil en la parte izquierda donde pone votar, y con eso queda como ayuda, pero no como respuesta, ya que esto pervive en el tiempo y se pierde un poco la idea.

    jueves, 2 de mayo de 2019 5:02
  • Ok amigo de vuelvo a darte las gracias ya hice lo que me dijistes puse como respuesta a los link y gracias
    jueves, 2 de mayo de 2019 5:52
  • De nada
    jueves, 2 de mayo de 2019 10:21