por Cesar Cassiano Schimanco

Arrastar e soltar para ordenar itens em ASP.NET - AJAX (Drag and Drop)

Neste artigo vou explicar como reordenar imagens ao arrastar e soltar usando ASP.NET + AJAX e salvar a nova ordenação no banco de dados.
Nada mais simples que arrastar e soltar, certo? 

Download do código deste artigo

Para isso vamos usar:
jquery-1.4.2.min.js
jquery-ui-1.7.1.custom.min.js

Script para criar a tabela de exemplo:

CREATE TABLE [dbo].[imagens](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[imagem] [nvarchar](200) NULL,
	[ordem] [int] NULL,
 CONSTRAINT [PK_imagens] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
INSERT INTO imagens (imagem, ordem) VALUES ('exemplo1.jpg', 1 )
INSERT INTO imagens (imagem, ordem) VALUES ('exemplo2.jpg', 2 )
INSERT INTO imagens (imagem, ordem) VALUES ('exemplo4.jpg', 3 )
INSERT INTO imagens (imagem, ordem) VALUES ('exemplo3.jpg', 4 )

Muito bem, agora vamos criar um Repeater

default.aspx

<asp:repeater runat="server" ID="repImagens">
	<HeaderTemplate>
		<div class="photos">
	</HeaderTemplate>
	<ItemTemplate>
		<img id="<%# Eval("id") %>" src="images/<%# Eval("imagem") %>" alt="" />
	</ItemTemplate>
	<FooterTemplate>
		</div>
	</FooterTemplate>
</asp:repeater>

default.aspx.cs

using System.Data.SqlClient;
...
protected void Page_Load(object sender, EventArgs e)
{
	string sConnectionString = "Server=.\\SQLEXPRESS;Database=BANCODEDADOS;User 
ID=USUARIO;Password=SENHA;Trusted_Connection=False;";
	using (SqlConnection Conn = new SqlConnection(sConnectionString))
	{
		string sSQL = @"SELECT id, imagem
		FROM imagens 
		ORDER BY ordem";
		SqlCommand myCommand = new SqlCommand(sSQL, Conn);

		Conn.Open();
		SqlDataReader dr = myCommand.ExecuteReader();

		repImagens.DataSource = dr;
		repImagens.DataBind();
		
		Conn.Close();
	}
}

 Como podemos observar no código acima, foi criada uma DIV com a classe photos onde as tags IMG tem o id igual ao seu id no banco de dados.
Agora vamos ao javascript que vai chamar o webservice.

default.aspx

<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.7.1.custom.min.js" type="text/javascript"></script>
<script type="text/javascript">
	//Função para reordenar itens
	$(function () {
		$(".photos").sortable({ opacity: 0.6, cursor: 'move', update: function () {
			//converter os IDs da imagens em array
			var order = $(this).sortable("toArray"); 
			//Mandando um POST para o webservice com a nova ordem
			$.ajax({
				type: 'POST'
			, url: "WebService.asmx/Reorder"
			, contentType: 'application/json; charset=utf-8'
			, dataType: 'json'
			, data: "{objOrdem:'" + order + "'}" //Envia a nova ordem
			, success: function (data, status) {
					
			}
			, error: function (xmlHttpRequest, status, err) {
				alert('error'); //No caso de ocorrer algum erro.
			}
			});
		}
		});
	});
</script>

Agora o webservice,
App_code/WebService.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data.SqlClient;

/// <summary>
/// Summary description for WebService
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService] //### importante descomentar esta linha ###
public class WebService : System.Web.Services.WebService {

    public WebService () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    #region Reorder
    [WebMethod(EnableSession = true)]
    public string Reorder(object objOrdem)
    {
        string[] s = objOrdem.ToString().Split(',');
        int i = 1;
        foreach (string item in s)
        {
            AtualizarOrdem(Convert.ToInt32(item), i);
            i++;
        }
        return string.Empty;
    }
    #endregion

    #region AtualizarOrdem
    private void AtualizarOrdem(int iID, int iOrder)
    {
        string sConnectionString = "Server=.\\SQLEXPRESS;Database=BANCODEDADOS;User ID=USUARIO;Password=SENHA;Trusted_Connection=False;";
        using (SqlConnection Conn = new SqlConnection(sConnectionString))
        {
            string sSQL = @"UPDATE imagens SET ordem = @ordem WHERE id = @id";
            SqlCommand myCommand = new SqlCommand(sSQL, Conn);
            myCommand.Parameters.AddWithValue("id", iID);
            myCommand.Parameters.AddWithValue("ordem", iOrder);
            Conn.Open();
            myCommand.ExecuteNonQuery();
            Conn.Close();
        }
    }
    #endregion
}


 

Comentários

Carregando comentários

Postar um novo comentário



Processando...