none
Metodo de Ordenacion al modificar de un listbox asp.net c# RRS feed

  • Pregunta

  • buenas tardes: la cuestion es la siguiente, tengo un ListBox cargado con datos de una tabla de sql al seleccionar un item se me pasan los datos a textbox y ahi modifico por ejemplo el orden de los productos y ok lo modifica, pero quisiera que al modificar tambien en al tabla se modifique el numero de orden x ejemplo

    original
    no_producto nombre
    1 mesas
    2 camas
    3 sillas
    4 puertas
    5 comedor

    al modificar
    no_producto nombre
    1 mesas
    2 camas
    3 sillas
    2

     

    puertas modifico el no

    5 comedor

    osea que se modifique asi
    no_producto nombre
    1 mesas
    2 puertas
    3camas

    -------------

    este antes era numero 2, pero al modificar paso a ser 3 ------------

    4 sillas
    5 comedor

    asi cargo mi listbox

          

     private void CargaListBox()
        {
            SqlCommand cm;
            SqlDataReader dr;
            SqlConnection con = new SqlConnection(sql);
            cm= new SqlCommand("select * from Productos by orden asc",con);
            con.Open();
            dr = cm.ExecuteReader();

            while (dr.Read())
            {
                lsblista.Items.Add(dr[3].ToString());
                lsblista.Items.Add(dr[1].ToString());
            } con.Close();
        }

    asi inserto a sql:

    protected void btninsert_Click(object sender, EventArgs e)
        {  
            SqlConnection con = new SqlConnection(consql); 
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "agregar";
            cmd.Parameters.Add("@no", SqlDbType.Int).Value = lblmensaje.Text.Trim();
            cmd.Parameters.Add("@producto", SqlDbType.Int).Value = txtproducto.Text.Trim();
            cmd.Connection = con;
            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                Response.Write("Record inserted successfully");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
                con.Dispose();
            } 
        }

    espero puedan orientarme, darme una idea de como hacer esto?, saludos.




    martes, 15 de marzo de 2016 18:31

Respuestas

  • Buenas tardes: asi soluciones mis pregunta,bueno parte aun no se como hacerlo que se actualice de vb.net a sql.

    int index = ListBox1.SelectedIndex;
    
                ListBox1.Items.Insert(index -1, ListBox1.SelectedItem.ToString());
                ListBox1.Items.RemoveAt(index + 1);
    
                ListBox1.Items[index - 1].Text = (Convert.ToInt32(ListBox1.Items[index - 1].Text) - 1).ToString() + " (Este se restó -1)";
                ListBox1.Items[index].Text = (Convert.ToInt32(ListBox1.Items[index].Text) + 1).ToString() + " (Este se sumó +1)";

    jueves, 17 de marzo de 2016 20:33

Todas las respuestas

  • osea nose si tenga que poner auxiliares que cuando encuentre otro no_producto igual lo incremete y asi los demas que esten abajo?,podrian darme un ejemplo o guiarme como hacer eso?
    martes, 15 de marzo de 2016 19:00
  • hola

    pero el no_producto no es el id o codigo de la entidad ? si es asi cuando insertas se generar un id nuevos, por lo generar ser ael ultimo que tengas +1

    lo que no entiendo porque dices que modificas si el boton dice "insertar" ? o sea invocas al procedure de "agregar", no deberias realizar un UPDATE si estas modificando

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 15 de marzo de 2016 19:04
  • Ok, lo que usted llama número de producto (no_producto) es en realidad una columna de ordenamiento.

    El algoritmo de cambio de orden mediante una casilla de texto para modificar el valor no es muy sencillo, aunque tampoco puede llamársele complejo.  Sin embargo existe en jQuery UI el widget Sortable que le vendría muy bien para esto.  El usuario reordena los items arrastrándolos en la página web, y luego simplemente hay que enviar el orden de los items al web server para que los almacene en memoria y listo.  Los valores que manda van en orden ascendente así que ya están todos los valores de todos los items modificados para reflejar los cambios.

    Si no, pues el algoritmo es algo como:

    1. Comparar el valor de ordenamiento nuevo con el anterior para determinar la dirección.
    2. Si la dirección fue hacia arriba (de mayor a menor), entonces aumentar en 1 el número de ordenamiento de todos los items cuyo número de ordenamiento es igual o mayor que el nuevo número del item modificado.
    3. Si la dirección fue hacia abajo, disminuir en 1 el número de ordenamiento de todos los items cuyo número de ordenamiento es igual o menor que el nuevo número del item modificado.
    4. Si almacena en base de datos, entonces debe almacenar todos estos valores.  Claro que en base de datos puede hacerse la actualización con una única sentencia UPDATE, así que más bien lo que debería tener es un procedimiento almacenado que mueve un item de un lugar a otro que encapsule la lógica anterior.

    Jose R. MCP
    Code Samples

    martes, 15 de marzo de 2016 19:05
    Moderador
  • >>cuando encuentre otro no_producto igual lo incremete

    pero el no_producto no deberias definirlo el usuario deberia ser algo automatico

    podrias usar el

    SELECT MAX(no_producto) FROM tabla

    para obtener el id maximo y sumarle uno

    pero no dejes que el usuario lo defina

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 15 de marzo de 2016 19:08
  • si es eso, Jose:

    dejame revisarlo y voy a  investigarlo algo asi ando buscando.

    gracias por tu tiempo y explicacion, que dios te bendiga.

    martes, 15 de marzo de 2016 19:10
  • no, osea yo seleciono un item del listbox y estos datos se pasan a textbox, en un txt se pone el no_producto yo le asigo un numero 3 entonces si habia un 3 se pase a 4 y asi consecutivamnte sin que tenga que meterme a modificar regristro por registro su no_producto
    martes, 15 de marzo de 2016 19:20
  • >>dejame revisarlo y voy a  investigarlo algo asi ando buscando.

    pero queria ordenarlo usando codigo cliente o codigo servidor ?

    porque si depsues de insertar recargar el list consultando la db se ordenarian directamente

    si despues de insertar usar CargaListBox() esto ordenara los items de la lista actualizando los datos, pero por supuesto habra un post al servidor, no es nada de ajax

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 15 de marzo de 2016 19:21
  • no, osea yo seleciono un item del listbox y estos datos se pasan a textbox, en un txt se pone el no_producto yo le asigo un numero 3 entonces si habia un 3 se pase a 4 y asi consecutivamnte sin que tenga que meterme a modificar regristro por registro su no_producto

    Usted no lo hace.  Lo hace SQL Server, o lo hace código de .net o lo hace código de Javascript (usando el widget Sortable de jQuery UI), etc.  Alguien tiene que hacerlo, o mejor dicho, algo.  Dejamos que una PC lo haga para evitarnos esa molestia.

    El punto es:  La modificación de ordenamiento de un elemento desencadenará potencialmente la modificación de todos los elementos (si yo muevo el último de primero, hay que cambiar el valor de orden a todos los items).


    Jose R. MCP
    Code Samples

    martes, 15 de marzo de 2016 19:23
    Moderador
  • *porque si depsues de insertar recargar el list consultando la db se ordenarian directamente...

    el listbox lo cargo con order by, pero como seria automaticamente en la db?

    martes, 15 de marzo de 2016 19:26
  • desde codigo de asp.net lo quiero realizar
    martes, 15 de marzo de 2016 19:30
  • >>desde codigo de asp.net lo quiero realizar

    ok, entonces deberias clarar

    porque mencionas que se modifica cuando en realidad insertas ?

    porque dejas que el usuario defina o modifique el no_producto cuando no deberia poder hacerlo ?, ya que entiendo es la key de la tabla

    porque depsues de insertar no invocas a CargaListBox() para que actualice y ordene la lista ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 15 de marzo de 2016 21:58
  • no es key arriba lo dije,es otro campo int,y dijo no inserto estoy modificando tambien lo dije,doy click sobre item de listbox se pasa a textbox y modifico su no_producto

    y al modificar se deben modificar todos los no_producto que esten debajo de el modificado si el modificado era 5 y cambio a 2 se pase para arriba y los demas cambien su numero

    martes, 15 de marzo de 2016 22:07
  • >>dijo no inserto estoy modificando tambien lo dije

    pero porque el procedure del codigo que muestras se llama "agregar" ?

    >>modificar se deben modificar todos los no_producto que esten debajo de el modificado si el modificado era 5 y cambio a 2 se pase para arriba y los demas cambien su numero

    podrias realziar un UPDATE del tipo

    UPDATE Tabla SET no_producto = no_producto +1 WHERE no_producto > @noproducto

    de esta forma incremetas en uno todos los no_producto que estes por detras del que modificas

    por supuesto esto es despues del update del que estas modificando


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 15 de marzo de 2016 22:13
  • esoty mostrando parte de mi codigo asi modifico:

           

    protected void btnupdate_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(consql);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "ActualC";

      cmd.Parameters.Add("@id", SqlDbType.Int).Value = lblid.Text.Trim();
            cmd.Parameters.Add("@no_producto", SqlDbType.Int).Value = txtp.Text.Trim();
        cmd.Parameters.Add("@nombre", SqlDbType.VarChar).Value = txtnombreText.Trim();
      
            cmd.Connection = con;
            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                Response.Write("Record inserted successfully");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
                con.Dispose();
            }
        }

    martes, 15 de marzo de 2016 22:28
  • entiendo tu update, pero eso no es lo que pregunto yo, quiero que al seleccionar un item se ponga en un textbox y ahi yo le doy un no_producto,ejemplo:

    original
    no_producto nombre
    1 mesas
    2 camas
    3 sillas
    4 puertas
    5 comedor

    al modificar
    no_producto nombre
    1 mesas
    2 camas
    3 sillas
    2

     

    puertas modifico el no

    5 comedor

    osea que se modifique asi
    no_producto nombre
    1 mesas
    2 puertas
    3camas

    -------------

    este antes era numero 2, pero al modificar paso a ser 3 ------------

    4 sillas
    5

    5comedor

    osea si ya habia uno igual lo reemplaze y todos los siguienes se incrementen.

       
    martes, 15 de marzo de 2016 22:33
  • datos cargados en listbox ,click item,click en modifico no_producto=si no_producto es igual a otro no_producto que ya este entonces incremento no_producto anterior y las demas ordenes que seguian de la del anterior y el nuevo no_producto se va hacia arriba de la lista o hacia abajo depende el no_producto
    martes, 15 de marzo de 2016 22:50
  • datos cargados en listbox ,click item,click en modifico no_producto=si no_producto es igual a otro no_producto que ya este entonces incremento no_producto anterior y las demas ordenes que seguian de la del anterior y el nuevo no_producto se va hacia arriba de la lista o hacia abajo depende el no_producto
    Veo que le da vueltas al asunto y no llega a nada.  ¿Por qué decide ignorar la respuesta que le di?  Es exactamente lo que busca.  Yo entendí su problema desde el momento que respondí con el algoritmo, ¿cierto?  Si es porque no entendió alguna parte de la explicación, con gusto trato de explicar nuevamente.  Si quiere seguir ignorando la respuesta, pues también es una posibilidad, solamente dígamelo y ya no me preocupo más por esta pregunta.

    Jose R. MCP
    Code Samples

    miércoles, 16 de marzo de 2016 13:31
    Moderador
  • buenos dias:

    si Jose,entiendo tu algoritmo,solo que le explicaba a leandro que me daba otra solucion que no es lo que busco.

    miércoles, 16 de marzo de 2016 14:22
  • hola

    >>solo que le explicaba a leandro que me daba otra solucion que no es lo que busco.

    porque ? no habias comentado "osea si ya habia uno igual lo reemplaze y todos los siguienes se incrementen."

    bueno la parte de "lo siguiente se incremente" lo puede lograr con

    UPDATE Tabla SET no_producto = no_producto +1 WHERE no_producto > @noproducto

    desde el valor que cambias incrementas todo en uno

    el problema es que en algun momento vas a tener dos registros con el mismo no_producto, por eso primero actualizas incrementando en uno y despues actualizas el que estas editando poniendole el valor

    pero remarco que deberias trabajar con el id de la entidad no con el no_producto si es que este no es la key de la tabla

    tiene que mover los no_producto de las entidades con el update y luego actualizar el que quieres a la posicion que buscas ubicarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 16 de marzo de 2016 14:59
  • Leandro aplique el update que me sugeriste y si me enfrento a que se repiten, al subir y el de abajo esta igual,pero al menos ya hace algo de lo que quiero gracias a tu ayuda.

    no se como hacer que no se repitan, revisa mi codigo a ver si vez una solucion,tal vez alhacer el selected cuando se mueva una para arriba el de abajo se incrmente?aun no se como hacerle

    *para subir un no y restarle y estar arriba.

    protected void btnarriba_Click1(object sender, EventArgs e)

        {
            int index = lsblista.SelectedIndex;
            lsblista.Items.Insert(lsblista.SelectedIndex - 1, lsblista.SelectedItem.ToString());
            lsblista.Items.RemoveAt(index + 1);
            SqlConnection con = new SqlConnection(sql);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "Incremento";
            cmd.Parameters.Add("@id", SqlDbType.Int).Value = lbli.Text.Trim();
            cmd.Parameters.Add("@no_producto", SqlDbType.Int).Value = lblp_cli.Text.Trim();
            cmd.Parameters.Add("@nombre", SqlDbType.VarChar).Value = txtnom.Text.Trim();
           
            cmd.Connection = con;
            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                Response.Write("Record Update successfully");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
                con.Dispose();
            }   

    *Store Procedure:

    *de subir: UPDATE Cat_Tipo_Contenedor SET nombre=@nombre, no_producto=@no_producto-1 where id=@id

    *de bajar: update  Cat_Tipo_Contenedor SET nombre=@nombre, no_producto=@no_producto+1 where id=@id

    *para al que quedo abajo sumarle un mas  en lugar del que subi tome su lugar:

           

    *boton para abajo

    int index = lsblista.SelectedIndex;
            lsblista.Items.Insert(lsblista.SelectedIndex + 1, lsblista.SelectedItem.ToString());
            lsblista.Items.RemoveAt(index - 1);
            SqlConnection con = new SqlConnection(sql);
            SqlCommand cmd = new SqlCommand();
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "Decremento";
           cmd.Parameters.Add("@id", SqlDbType.Int).Value = lbli.Text.Trim();
            cmd.Parameters.Add("@no_producto", SqlDbType.Int).Value = lblp_cli.Text.Trim();
            cmd.Parameters.Add("@nombre", SqlDbType.VarChar).Value = txtnom.Text.Trim();

            cmd.Connection = con;
            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                Response.Write("Record Update successfully");
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
                con.Dispose();
            }


    miércoles, 16 de marzo de 2016 23:18
  • Buenas tardes: asi soluciones mis pregunta,bueno parte aun no se como hacerlo que se actualice de vb.net a sql.

    int index = ListBox1.SelectedIndex;
    
                ListBox1.Items.Insert(index -1, ListBox1.SelectedItem.ToString());
                ListBox1.Items.RemoveAt(index + 1);
    
                ListBox1.Items[index - 1].Text = (Convert.ToInt32(ListBox1.Items[index - 1].Text) - 1).ToString() + " (Este se restó -1)";
                ListBox1.Items[index].Text = (Convert.ToInt32(ListBox1.Items[index].Text) + 1).ToString() + " (Este se sumó +1)";

    jueves, 17 de marzo de 2016 20:33
  • gracias, si me siervio, solo use esto:

    int index = ListBox1.SelectedIndex;
    
                ListBox1.Items.Insert(index -1, ListBox1.SelectedItem.ToString());
                ListBox1.Items.RemoveAt(index + 1);
    

    aun tengo dudas uso textbox para restar y sumar,pero al actualizar en el update aun no se como,ya que en el mismo update tengo un campo y ese mismo campo en vb se actualiza el mismo campo con diferentes datos

    ejemplo

    muevo

     id  no

    1    1

    2    2

    2    3 

    al subir 3 se resta se vuelve 2 y el 2 se baja se suma a 3 hasta ahi esta bien,luego el update pongo parametros a dos textbox un textbox1=3 y textbox2=2 osea el campo de no se actualice esos dos textbox,pero marca error "System.Data.SqlClient.SqlException: Procedure or function Incremento has too many arguments specified.' ese 

    viernes, 18 de marzo de 2016 19:31