Dot Net: GridView paginada com checkbox

Category : Post

Essa solução serve para manter o checkbox checado depois que mudar a página na GridView e salvar todos os marcados quando clicar em um botão.

Fiz um exemplo para C# (CSharp) e outro para VB.NET.

O projeto completo de exemplo, com o codigo da página .aspx está armazenado no Google Code (VB.NET e C#).

View Code CSHARP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
 
public partial class _Default : System.Web.UI.Page
{
 
    /// <summary>
    /// Armazena as ID's em uma viewstate
    /// </summary>
    public List<int> lstIdChkChecados
    {
        get
        {
            if (ViewState["lstIdChkChecados"] == null)
            {
                ViewState["lstIdChkChecados"] = new List<int>();
            }
            return (List<int>)ViewState["lstIdChkChecados"];
        }
        set
        {
            ViewState["lstIdChkChecados"] = value;
        }
    }
 
    /// <summary>
    /// atualiza o viewstate com as ID's da DataKey (DataKeyNames) da gridview.
    /// </summary>
    protected void AtualizaViewStateChkChecados()
    {
        foreach (GridViewRow row in GridView1.Rows)
        {
            CheckBox Chk = ((CheckBox)row.FindControl("CheckBox1"));
            if (Chk.Checked)
            {
                if (!lstIdChkChecados.Contains((int)GridView1.DataKeys[row.RowIndex][0]))
                {
                    lstIdChkChecados.Add((int)GridView1.DataKeys[row.RowIndex][0]);
                }
            }
            else
            {
                if (lstIdChkChecados.Contains((int)GridView1.DataKeys[row.RowIndex][0]))
                {
                    lstIdChkChecados.Remove((int)GridView1.DataKeys[row.RowIndex][0]);
                }
            }
        }
    }
 
    /// <summary>
    /// Quando clica para mudar de página, é executado o método AtualizaViewStateChkChecados() antes de atualizar o GridView.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        AtualizaViewStateChkChecados();
    }
 
    /// <summary>
    /// Depois que ocorre a mudança, verifica se na página atual da GridView existe checkbox marcados.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void GridView1_PreRender(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            foreach (DataRowView row in SqlDataSource1.Select(DataSourceSelectArguments.Empty))
            {
                if ((bool)row["Ativo"])
                {
                    lstIdChkChecados.Add((int)row["ID"]);
                }
            }
        }
        foreach (GridViewRow row in GridView1.Rows)
        {
            ((CheckBox)row.FindControl("CheckBox1")).Checked = lstIdChkChecados.Contains((int)GridView1.DataKeys[row.RowIndex][0]);
        }
    }
 
    /// <summary>
    /// Atualiza a tabela do banco de dados usando lstIdChkChecados
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void btnAtualizar_Click(object sender, EventArgs e)
    {
        AtualizaViewStateChkChecados();
        SqlConnection conexao = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlConnectionStringSqlServer"].ConnectionString);
        try
        {
            conexao.Open();
 
            SqlCommand comando = new SqlCommand();
            comando.Parameters.Add("@Ativo", SqlDbType.Bit).Value = false;
            comando.CommandText = "UPDATE DotNet_GridViewPaginadaComCheckbox SET Ativo = @Ativo";
            comando.CommandType = CommandType.Text;
            comando.Connection = conexao;
            comando.ExecuteNonQuery();
 
            // Antes de fechar a conexão, passa por todos os itens do lstIdChkChecados e atualiza no banco, passando o campo Ativo para true.
            comando.CommandText = "UPDATE DotNet_GridViewPaginadaComCheckbox SET Ativo = @Ativo WHERE ID = @ID";
            comando.Parameters[0].Value = true;
            comando.Parameters.Add("@ID", SqlDbType.Int);
            foreach (int item in lstIdChkChecados)
            {
                comando.Parameters[1].Value = item;
                comando.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
 
        }
        finally
        {
            conexao.Close();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
Imports System.Data
Imports System.Data.SqlClient
 
Partial Class _Default
    Inherits System.Web.UI.Page
 
    ''' <summary>
    ''' Armazena as ID's em uma viewstate
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property lstIdChkChecados() As List(Of Integer)
        Get
            If ViewState("lstIdChkChecados") Is Nothing Then ViewState("lstIdChkChecados") = New List(Of Integer)
            Return ViewState("lstIdChkChecados")
        End Get
        Set(ByVal value As List(Of Integer))
            ViewState("lstIdChkChecados") = value
        End Set
    End Property
 
    ''' <summary>
    ''' atualiza o viewstate com as ID's da DataKey (DataKeyNames) da gridview.
    ''' </summary>
    ''' <remarks></remarks>
    Sub AtualizaViewStateChkChecados()
        Dim Chk As CheckBox
        For Each row As GridViewRow In GridView1.Rows
            Chk = DirectCast(row.FindControl("CheckBox1"), CheckBox)
 
            If Chk.Checked Then
                If Not lstIdChkChecados.Contains(GridView1.DataKeys(row.RowIndex)(0)) Then
                    lstIdChkChecados.Add(GridView1.DataKeys(row.RowIndex)(0))
                End If
            Else
                If lstIdChkChecados.Contains(GridView1.DataKeys(row.RowIndex)(0)) Then
                    lstIdChkChecados.Remove(GridView1.DataKeys(row.RowIndex)(0))
                End If
            End If
        Next
    End Sub
 
    ''' <summary>
    ''' Quando clica para mudar de página, é executado o método AtualizaViewStateChkChecados() antes de atualizar o GridView.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging
        AtualizaViewStateChkChecados()
    End Sub
 
    ''' <summary>
    ''' Depois que ocorre a mudança, verifica se na página atual da GridView existe checkbox marcados.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub GridView1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridView1.PreRender
        If Not IsPostBack Then
            For Each row As DataRowView In SqlDataSource1.Select(DataSourceSelectArguments.Empty)
                If row("Ativo") Then
                    lstIdChkChecados.Add(row("ID"))
                End If
            Next
        End If
        For Each row As GridViewRow In GridView1.Rows
            DirectCast(row.FindControl("CheckBox1"), CheckBox).Checked = lstIdChkChecados.Contains(GridView1.DataKeys(row.RowIndex)(0))
        Next
    End Sub
 
    ''' <summary>
    ''' Atualiza a tabela do banco de dados usando lstIdChkChecados
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Protected Sub btnAtualizar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAtualizar.Click
        AtualizaViewStateChkChecados()
 
        Dim conexao As New SqlConnection(ConfigurationManager.ConnectionStrings("SqlConnectionStringSqlServer").ConnectionString)
        Try
            ' Primeiro atualiza todos os registros, passando o campo Ativo para FALSE
            ' Se for usar em uma tabela com muitos registros, deve arrumar uma solução para um melhor desempenho
            conexao.Open()
            Dim comando As New SqlCommand
            comando.Parameters.Add("@Ativo", SqlDbType.Bit).Value = False
            comando.CommandText = "UPDATE DotNet_GridViewPaginadaComCheckbox SET Ativo = @Ativo"
            comando.CommandType = CommandType.Text
            comando.Connection = conexao
            comando.ExecuteNonQuery()
 
            ' Antes de fechar a conexão, passa por todos os itens do lstIdChkChecados e atualiza no banco, passando o campo Ativo para true.
            comando.CommandText = "UPDATE DotNet_GridViewPaginadaComCheckbox SET Ativo = @Ativo WHERE ID = @ID"
            comando.Parameters(0).Value = True
            comando.Parameters.Add("@ID", SqlDbType.Int)
            For Each item As Integer In lstIdChkChecados
                comando.Parameters(1).Value = item
                comando.ExecuteNonQuery()
            Next
 
        Catch ex As Exception
 
        Finally
            conexao.Close()
        End Try
 
 
    End Sub
 
End Class

Post a comment