حفظ حالت checkbox در صفحه بندی کنترل GridView

حفظ حالت checkbox

در این مقاله نشان می دهیم که وضعیت انتخاب شده یا انتخاب نشده checkbox را چگونه در صفحات یک GridView حفظ نماییم. به این دلیل که در صفحه بندی، زمانی که صفحات مختلف را مرور می کنیم و به صفحه قبلی برمی گردیم وضعیت checkbox ها از بین رفته و به حالت پیش فرض در می آید.

حفظ حالت checkbox

برای شروع، ما GridViewای به شکل زیر داریم:

<asp:GridView ID="GridView1" runat="server"
AutoGenerateColumns = "false" Font-Names = "Arial"
Font-Size = "۱۱pt" AlternatingRowStyle-BackColor = "#C2D69B" 
HeaderStyle-BackColor = "green" AllowPaging ="true"  
OnPageIndexChanging = "OnPaging" OnRowDataBound = "RowDataBound"  PageSize="10">
<Columns>
<asp:TemplateField>
    <HeaderTemplate>
        <asp:CheckBox ID="chkAll" runat="server"
            onclick = "checkAll(this);" />
    </HeaderTemplate>
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox1" runat="server"
            onclick = "Check_Click(this)"/>
    </ItemTemplate>
</asp:TemplateField>
<asp:BoundField ItemStyle-Width = "۱۵۰px"
    DataField = "CustomerID" HeaderText = "CustomerID" />
<asp:BoundField ItemStyle-Width = "۱۵۰px"
    DataField = "City" HeaderText = "City"/>
<asp:BoundField ItemStyle-Width = "۱۵۰px"
    DataField = "Country" HeaderText = "Country"/>
<asp:BoundField ItemStyle-Width = "۱۵۰px"
    DataField = "PostalCode" HeaderText = "PostalCode"/>
</Columns>
</asp:GridView>

GridView داده ها را از جدول customers در دیتابیس Northwind می گیرد.
فضاهای نام:
از آنجا که برای ذخیره checkbox های انتخاب شده از ArrayList استفاده کردیم، باید فضای نام زیر را وارد کنیم.

سی شارپ

using System.Collections;

VB.Net

Imports System.Collections

قطعه کد زیر بررسی می کند که آیا ViewState هیچ ArrayList ای در خود ذخیره دارد یا خیر، اگر وجود داشت آن را از ViewState می گیرد، در غیر این صورت یک ArrayList جدید ایجاد می کند که checkbox های انتخاب شده را در خود ذخیره می کند.

سی شارپ

ArrayList CheckBoxArray;
if (ViewState["CheckBoxArray"] != null)
{
    CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"];
}
else
{
    CheckBoxArray = new ArrayList();
}

قطعه کد بعدی رفرنس سطر عنوان را دریافت می کند، همه checkbox ها را بررسی می کند که آیا انتخاب شده اند یا خیر. اگر checkbox انتخاب شده باشد، رفرنس آن را با فرمت chkAll-0 به ArrayList اضافه می کند که ۰ ایندکس صفحه GridView می باشد. اگر checkbox انتخاب نشده باشد، بررسی می کند که آیا رفرنس آن در ArrayList وجود دارد یا خیر، اگر وجود داشت آن را حذف کرده و flag ای با عنوان CheckAllWasChecked را که در کد بعدی به کار می آید، تنظیم می کند.

سی شارپ

int CheckBoxIndex;
    bool CheckAllWasChecked=false;
    CheckBox chkAll =
     (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkAll");
    string checkAllIndex = "chkAll-" + GridView1.PageIndex;
    if (chkAll.Checked)
    {
        if (CheckBoxArray.IndexOf(checkAllIndex) == -1)
        {
            CheckBoxArray.Add(checkAllIndex);
        }
    }
    else
    {
        if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
        {
            CheckBoxArray.Remove(checkAllIndex);
            CheckAllWasChecked = true;
        }
    }

VB.Net

Dim CheckBoxIndex As Integer
Dim CheckAllWasChecked As Boolean = False
Dim chkAll As CheckBox = _
DirectCast(GridView1.HeaderRow.Cells(0).FindControl("chkAll"), CheckBox)
 
Dim checkAllIndex As String = "chkAll-" & GridView1.PageIndex
 
If chkAll.Checked Then
   If CheckBoxArray.IndexOf(checkAllIndex) = -1 Then
      CheckBoxArray.Add(checkAllIndex)
   End If
Else
   If CheckBoxArray.IndexOf(checkAllIndex) <> -1 Then
      CheckBoxArray.Remove(checkAllIndex)
      CheckAllWasChecked = True
   End If
End If

کد بعدی یک حلقه روی سطرهای GridView اجرا کرده و بررسی می کند که آیا checkbox مربوط به آن سطر انتخاب شده یا خیر. اگر انتخاب شده بود، موقعیت آن با فرمول زیر محاسبه می شود:
CheckBoxIndex = GridView1.PageSize * GridView1.PageIndex + (RowIndex + 1)
فرمول بالا را checkbox را می دهد. اندیس RowIndex و PageIndex از صفر شروع می شود یعنی سطر اول و صفحه اول هر دو ۰ هستند.
اگر checkbox انتخاب شده باشد، CheckBoxIndex آن به ArrayList اضافه می شود، در غیر این صورت اگر اندیس آن در آرایه وجود داشته باشد و انتخاب نشده باشد، حذف می شود.

سی شارپ

for (int i = 0; i < GridView1.Rows.Count; i++)
{
    if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
    {
        CheckBox chk =
         (CheckBox)GridView1.Rows[i].Cells[0].FindControl("CheckBox1");
        CheckBoxIndex = GridView1.PageSize * GridView1.PageIndex + (i + 1);
        if (chk.Checked)
        {
            if (CheckBoxArray.IndexOf(CheckBoxIndex) == -1
                && !CheckAllWasChecked)
            {
                CheckBoxArray.Add(CheckBoxIndex);
            }
        }
        else
        {
            if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1
                || CheckAllWasChecked)
            {
                CheckBoxArray.Remove(CheckBoxIndex);
            }
        }
    }
}

VB.Net

For i As Integer = ۰ To GridView1.Rows.Count - 1
   If GridView1.Rows(i).RowType = DataControlRowType.DataRow Then
     Dim chk As CheckBox = _
     DirectCast(GridView1.Rows(i).Cells(0) _
     .FindControl("CheckBox1"), CheckBox)
     CheckBoxIndex = GridView1.PageSize * GridView1.PageIndex + (i + 1)
     If chk.Checked Then
       If CheckBoxArray.IndexOf(CheckBoxIndex) = -1 And _
       Not CheckAllWasChecked Then
          CheckBoxArray.Add(CheckBoxIndex)
       End If
       Else
         If CheckBoxArray.IndexOf(CheckBoxIndex) <> -1 Or _
          CheckAllWasChecked Then
          CheckBoxArray.Remove(CheckBoxIndex)
       End If
     End If
   End If
Next

کد کامل این مثال به شکل زیر خواهد بود:

if (IsPostBack)
{
    int CheckBoxIndex;
    bool CheckAllWasChecked=false;
    CheckBox chkAll =
     (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkAll");
    string checkAllIndex = "chkAll-" + GridView1.PageIndex;
    if (chkAll.Checked)
    {
        if (CheckBoxArray.IndexOf(checkAllIndex) == -1)
        {
            CheckBoxArray.Add(checkAllIndex);
        }
    }
    else
    {
        if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
        {
            CheckBoxArray.Remove(checkAllIndex);
            CheckAllWasChecked = true;
        }
    }
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
        if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
        {
          CheckBox chk =
          (CheckBox)GridView1.Rows[i].Cells[0].FindControl("CheckBox1");
           CheckBoxIndex=GridView1.PageSize*GridView1.PageIndex + (i + 1);
          if (chk.Checked)
          {
                if (CheckBoxArray.IndexOf(CheckBoxIndex) == -1
                    && !CheckAllWasChecked)
                {
                    CheckBoxArray.Add(CheckBoxIndex);
                }
          }
          else
          {
                if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1
                    || CheckAllWasChecked)
                {
                    CheckBoxArray.Remove(CheckBoxIndex);
                }
          }
        }
    }
}

VB.Net

If IsPostBack Then
  Dim CheckBoxIndex As Integer
  Dim CheckAllWasChecked As Boolean = False
  Dim chkAll As CheckBox = _
   DirectCast(GridView1.HeaderRow.Cells(0).FindControl("chkAll"), CheckBox)
 
  Dim checkAllIndex As String = "chkAll-" & GridView1.PageIndex
  If chkAll.Checked Then
     If CheckBoxArray.IndexOf(checkAllIndex) = -1 Then
       CheckBoxArray.Add(checkAllIndex)
     End If
  Else
     If CheckBoxArray.IndexOf(checkAllIndex) <> -1 Then
       CheckBoxArray.Remove(checkAllIndex)
       CheckAllWasChecked = True
     End If
  End If
  For i As Integer = ۰ To GridView1.Rows.Count - 1
   If GridView1.Rows(i).RowType = DataControlRowType.DataRow Then
     Dim chk As CheckBox = _
      DirectCast(GridView1.Rows(i).Cells(0) _
      .FindControl("CheckBox1"), CheckBox)
     CheckBoxIndex = GridView1.PageSize * GridView1.PageIndex + (i + 1)
     If chk.Checked Then
       If CheckBoxArray.IndexOf(CheckBoxIndex) = -1 And _
        Not CheckAllWasChecked Then
          CheckBoxArray.Add(CheckBoxIndex)
     End If
     Else
      If CheckBoxArray.IndexOf(CheckBoxIndex) <> -1 Or _
        CheckAllWasChecked Then
         CheckBoxArray.Remove(CheckBoxIndex)
       End If
     End If
   End If
  Next
End If

زمانی که این کار انجام شد، ArrayList در ViewState ذخیره می شود.

سی شارپ

ViewState["CheckBoxArray"] = CheckBoxArray;

VB.Net

ViewState("CheckBoxArray") = CheckBoxArray

حال در رویداد paging مربوط به GridView باید checkbox هایی را که در ArrayList وجود دارند و در ViewState ذخیره شده اند، دوباره به حالت انتخاب دربیاوریم. اگر Check All checkbox برای اندیس این صفحه تیک خورده باشد، همه checkboxها به حالت انتخاب در می آیند. همزمان با انتخاب checkbox ها رنگ پس زمینه را نیز به checkboxهای انتخاب شده اعمال می کند.

سی شارپ

ArrayList CheckBoxArray = (ArrayList)ViewState["CheckBoxArray"];
string checkAllIndex = "chkAll-" + GridView1.PageIndex;
 
if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
{
    CheckBox chkAll =
     (CheckBox)GridView1.HeaderRow.Cells[0].FindControl("chkAll");
    chkAll.Checked = true;
}
for (int i = 0; i < GridView1.Rows.Count; i++)
{
if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
{
    if (CheckBoxArray.IndexOf(checkAllIndex) != -1)
    {
        CheckBox chk =
         (CheckBox)GridView1.Rows[i].Cells[0].FindControl("CheckBox1");
        chk.Checked = true;
        GridView1.Rows[i].Attributes.Add("style","background-color:aqua");     
    }
    else
    {
      int CheckBoxIndex =GridView1.PageSize*(GridView1.PageIndex)+(i + 1);
      if (CheckBoxArray.IndexOf(CheckBoxIndex) != -1)
      {
         CheckBox chk =
         (CheckBox)GridView1.Rows[i].Cells[0].FindControl("CheckBox1");
        chk.Checked = true;
        GridView1.Rows[i].Attributes.Add("style", "background-color:aqua");
      }
    }
}
}

VB.Net

For i As Integer = ۰ To GridView1.Rows.Count - 1
   If GridView1.Rows(i).RowType = DataControlRowType.DataRow Then
     If CheckBoxArray.IndexOf(checkAllIndex) <> -1 Then
       Dim chk As CheckBox = _
        DirectCast(GridView1.Rows(i).Cells(0) _
        .FindControl("CheckBox1"), CheckBox)
       chk.Checked = True
       GridView1.Rows(i).Attributes.Add("style", "background-color:aqua")
     Else
       Dim CheckBoxIndex As Integer
           = GridView1.PageSize*(GridView1.PageIndex)+(i+1)
       If CheckBoxArray.IndexOf(CheckBoxIndex) <> -1 Then
        Dim chk As CheckBox = _
         DirectCast(GridView1.Rows(i).Cells(0) _
         .FindControl("CheckBox1"), CheckBox)
        chk.Checked = True
        GridView1.Rows(i).Attributes.Add("style", "background-color:aqua")
       End If
     End If
   End If
Next

حفظ حالت checkbox

موفق باشید !

داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

ما یک پرسشنامه‌ی کوچولو داریم، که قول میدیم وقتتون رو خیلی نمی‌گیره، ولی کلی به ما کمک می‌کنه، چون هم assessment مونه ,و هم شما به ما در این زمینه کمک میکنید.بزن بریم