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(); } } } |
View Code VB
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 |

