توضیحات و دانلود

حذف چند گانه ردیف در کنترل Gridview با استفاده از CheckBoxes در Asp.net
0 0
حذف چند گانه ردیف در کنترل Gridview با استفاده از CheckBoxes در Asp.net

با سلام در اینجا توضیح می دهیم چگونه چند ردیف یا رکورد انتخاب شده از ASP.net GridView را پاک کنید. در موارد بسیاری نیاز است که کاربر ردیف های متعدد یا سوابق انتخاب شده را با استفاده از یک دکمه حذف کند.این مثال GridView با استفاده از پیمایش فعال می شود که بدین معناست که شما می توانید با انتخاب سوابق در چندین ردیف در چندین صفحه را در یک بارحذف کنید .

بنابراین ابتدا با استفاده از این آموزش ابتدا بایستی پایگاه داده Sample Northwind را با استفاده از لینک زیر به دست آورید .

پایگاه داده SQL Server NorthWind را دانلود کنید

GridView Mark-up

کد HTML ASP.Net GridView برای این آموزش استفاده شده است.

<asp:GridView ID="gvAll" runat="server"

    AutoGenerateColumns = "false" Font-Names = "Arial"

    Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B" 

    HeaderStyle-BackColor = "green" AllowPaging ="true"  

    OnPageIndexChanging = "OnPaging" DataKeyNames = "CustomerID"

    PageSize = "10" >

   <Columns>

    <asp:TemplateField>

        <HeaderTemplate>

            <asp:CheckBox ID="chkAll" runat="server"

             onclick = "checkAll(this);" />

        </HeaderTemplate>

        <ItemTemplate>

            <asp:CheckBox ID="chk" runat="server"

             onclick = "Check_Click(this)"/>

        </ItemTemplate>

    </asp:TemplateField>

    <asp:BoundField ItemStyle-Width = "150px" DataField = "ContactName"

       HeaderText = "Contact Name"/>

    <asp:BoundField ItemStyle-Width = "150px" DataField = "Country"

       HeaderText = "Country"/>

    <asp:BoundField ItemStyle-Width = "150px" DataField = "City"

       HeaderText = "City"/>

   </Columns>

   <AlternatingRowStyle BackColor="#C2D69B"  />

</asp:GridView>

<asp:HiddenField ID="hfCount" runat="server" Value = "0" />

<asp:Button ID="btnDelete" runat="server" Text="Delete Checked Records"

   OnClientClick = "return ConfirmDelete();" OnClick="btnDelete_Click" />

 با توجه به بالا یک فیلد قالب را با checkboxe اضافه کرده ایم و همه چک باکس در کنترل Template Header ASP.net GridView بررسی کنید . فیلد پنهانی برای ذخیره تعداد سوابق انتخاب شده و دکمه حذف برای راه اندازی عملیات حذف وجود دارد. پیمایش برای GridView فعال است و رویداد OnPageIndexChanging وجود دارد که بعدا توضیح داده خواهد شد. CustomerID به ویژگی DataKeyNames GridView اختصاص داده می شود که به ما اجازه می دهد تا هر ردیف منحصر به فرد را شناسایی کنیم

اتصال داده ها در کنترل GridView

 از جدول مشتریان از پایگاه داده Northwind برای این مثال استفاده کرده ایم. جدول مشتریان با برخی از جداول دیگر رابطه دارد و به همین دلیل اجازه حذف مستقیم را بدون حذف منابع کلیدی خارجی نخواهد داشت. از این رو برای ایجاد آن ، یک جدول جدید به نام TestCustomers ایجاد خواهد شد و از آن استفاده می شود. برای ایجاد یک جدول کلون، query زیر را اجرا کنید.

یSELECT * INTO TestCustomers

FROM Customers

query بالا یک جدول جدید TestCustomers ایجاد می کند و تمام پرونده ها را از جدول مشتریان به TestCustomers کپی می کند. بنابراین اکنون می توانیم از آن برای آموزش استفاده کنیم. تابع زیر برای کنترل دیتابیس GridView استفاده می شود

C #

private void BindGrid()

{

    string constr = ConfigurationManager

                .ConnectionStrings["conString"].ConnectionString;

    string query = "select * from TestCustomers";

    SqlConnection con = new SqlConnection(constr);

    SqlDataAdapter sda = new SqlDataAdapter(query, con);

    DataTable dt = new DataTable();

    sda.Fill(dt);

    gvAll.DataSource = dt;

    gvAll.DataBind();

}

VB.Net

Private Sub BindGrid()

    Dim constr As String = ConfigurationManager _

                    .ConnectionStrings("conString").ConnectionString()

    Dim query As String = "select * from TestCustomers"

    Dim con As New SqlConnection(constr)

    Dim sda As New SqlDataAdapter(query, con)

    Dim dt As New DataTable()

    sda.Fill(dt)

    gvAll.DataSource = dt

    gvAll.DataBind()

End Sub

حفظ حالت Checkboxes در هنگام پیمایش

این بخش اصلی این مثال است؛ زیرا کار آن این است که ردیفهای انتخاب شده را بدون توجه به صفحه ای که متعلق به آن است، حفظ کند و همچنین وضعیت جعبه ها را تا زمانی که کاربر از یک صفحه به صفحه دیگرمی رود  صفحه بندی را نگه می دارد، .

برای تسهیل آن ، از دو روش زیر استفاده شده است :

1. GetData

تابع GetData به سادگی سوابق را برای کاربر تعیین , جعبه را چک و آنها را به ArrayList می افزاید و سپس ArrayList را به ViewState می برد .

C #

private void GetData()

{

    ArrayList arr;

    if (ViewState["SelectedRecords"] != null)

        arr = (ArrayList)ViewState["SelectedRecords"];

    else

        arr = new ArrayList();

    CheckBox chkAll = (CheckBox)gvAll.HeaderRow

                        .Cells[0].FindControl("chkAll");

    for (int i = 0; i < gvAll.Rows.Count; i++)

    {

        if (chkAll.Checked)

        {

            if (!arr.Contains(gvAll.DataKeys[i].Value))

            {

                arr.Add(gvAll.DataKeys[i].Value);

            }

        }

        else

        {

            CheckBox chk = (CheckBox)gvAll.Rows[i]

                               .Cells[0].FindControl("chk");

            if (chk.Checked)

            {

                if (!arr.Contains(gvAll.DataKeys[i].Value))

                {

                    arr.Add(gvAll.DataKeys[i].Value);

                }

            }

            else

            {

                if (arr.Contains(gvAll.DataKeys[i].Value))

                {

                    arr.Remove(gvAll.DataKeys[i].Value);

                }

            }

        }

    }

    ViewState["SelectedRecords"] = arr;

}

VB.Net

Private Sub GetData()

    Dim arr As ArrayList

    If ViewState("SelectedRecords") IsNot Nothing Then

         arr = DirectCast(ViewState("SelectedRecords"), ArrayList)

    Else

         arr = New ArrayList()

    End If

    Dim chkAll As CheckBox = DirectCast(gvAll.HeaderRow _

                    .Cells(0).FindControl("chkAll"), CheckBox)

    For i As Integer = 0 To gvAll.Rows.Count - 1

       If chkAll.Checked Then

             If Not arr.Contains(gvAll.DataKeys(i).Value) Then

                 arr.Add(gvAll.DataKeys(i).Value)

             End If

       Else

             Dim chk As CheckBox = DirectCast(gvAll.Rows(i).Cells(0) _

                                            .FindControl("chk"), CheckBox)

             If chk.Checked Then

                If Not arr.Contains(gvAll.DataKeys(i).Value) Then

                     arr.Add(gvAll.DataKeys(i).Value)

                End If

             Else

                If arr.Contains(gvAll.DataKeys(i).Value) Then

                     arr.Remove(gvAll.DataKeys(i).Value)

                End If

             End If

       End If

    Next

    ViewState("SelectedRecords") = arr

End Sub

GetData در رویداد Page Load از صفحه وب ASP.Net به روش زیر استفاده می شود :

C #

protected void Page_Load(object sender, EventArgs e)

{

    if (IsPostBack)

        GetData();

    BindGrid();

}

VB.Net

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

    If IsPostBack Then

         GetData()

    End If

    BindGrid()

End Sub

2. SetData

تابع SetData به سادگی حالت وضعیت ذخیره شده checkbox ها را در ViewState بازیابی می کند .

C #

private void SetData()

{

    int currentCount = 0;

    CheckBox chkAll = (CheckBox)gvAll.HeaderRow

                            .Cells[0].FindControl("chkAll");

    chkAll.Checked = true;

    ArrayList arr = (ArrayList)ViewState["SelectedRecords"];

    for (int i = 0; i < gvAll.Rows.Count; i++)

    {

        CheckBox chk = (CheckBox)gvAll.Rows[i]

                        .Cells[0].FindControl("chk");

        if (chk != null)

        {

            chk.Checked = arr.Contains(gvAll.DataKeys[i].Value);

            if (!chk.Checked)

                chkAll.Checked = false;

            else

                currentCount++;

        }

    }

    hfCount.Value = (arr.Count - currentCount).ToString(); 

}

VB.Net

Private Sub SetData()

  Dim currentCount As Integer = 0

  Dim chkAll As CheckBox = DirectCast(gvAll.HeaderRow _

                        .Cells(0).FindControl("chkAll"), CheckBox)

  chkAll.Checked = True

  Dim arr As ArrayList = DirectCast(ViewState("SelectedRecords") _

                                        , ArrayList)

  For i As Integer = 0 To gvAll.Rows.Count - 1

     Dim chk As CheckBox = DirectCast(gvAll.Rows(i).Cells(0) _

                                         .FindControl("chk"), CheckBox)

     If chk IsNot Nothing Then

         chk.Checked = arr.Contains(gvAll.DataKeys(i).Value)

         If Not chk.Checked Then

                chkAll.Checked = False

         Else

                currentCount += 1

         End If

     End If

  Next

  hfCount.Value = (arr.Count - currentCount).ToString()

End Sub

روش SetData در رویداد OnPageIndexChanging از GridView به روش زیر فراخوانی می شود

C #

protected void OnPaging(object sender, GridViewPageEventArgs e)

{

    gvAll.PageIndex = e.NewPageIndex;

    gvAll.DataBind();

    SetData();

}

VB.Net

Protected Sub OnPaging(ByVal sender As Object, ByVal e As GridViewPageEventArgs)

    gvAll.PageIndex = e.NewPageIndex

    gvAll.DataBind()

    SetData()

End Sub

حذف چندین ردیف انتخاب شده

زمانی که دکمه حذف توسط کاربر کلیک می شود رویداد زیر اجرا میشود .

C #

protected void btnDelete_Click(object sender, EventArgs e)

{

    int count = 0;

    SetData();

    gvAll.AllowPaging = false;

    gvAll.DataBind(); 

    ArrayList arr = (ArrayList)ViewState["SelectedRecords"];

    count = arr.Count;

    for (int i = 0; i < gvAll.Rows.Count; i++)

    {

        if (arr.Contains(gvAll.DataKeys[i].Value))

        {

            DeleteRecord(gvAll.DataKeys[i].Value.ToString());

            arr.Remove(gvAll.DataKeys[i].Value);

        }

    }

    ViewState["SelectedRecords"] = arr;

    hfCount.Value = "0";

    gvAll.AllowPaging = true;

    BindGrid();

    ShowMessage(count);

}

VB.Net

Protected Sub btnDelete_Click(ByVal sender As Object, ByVal e As EventArgs)

    Dim count As Integer = 0

    SetData()

    gvAll.AllowPaging = False

    gvAll.DataBind()

    Dim arr As ArrayList = DirectCast(ViewState("SelectedRecords") _

                                    , ArrayList)

    count = arr.Count

    For i As Integer = 0 To gvAll.Rows.Count - 1

        If arr.Contains(gvAll.DataKeys(i).Value) Then

              DeleteRecord(gvAll.DataKeys(i).Value.ToString())

              arr.Remove(gvAll.DataKeys(i).Value)

        End If

    Next

    ViewState("SelectedRecords") = arr

    hfCount.Value = "0"

    gvAll.AllowPaging = True

    BindGrid()

    ShowMessage(count)

End Sub

در رویداد فوق، از طریق GridView حلقه می زنیم و اگررکورد در ArrayList وجود داشته باشد، آن را با استفاده از روش DeleteRecord حذف می کند. در نهایت یک جعبه هشدار جاوااسکریپت را نشان می دهیم تا کاربر را مطلع کند که عملیات حذف با استفاده از روش ShowMessage به پایان رسیده است .

روش حذف رکورد

در روش حذف رکورد به سادگی رکورد را از جدول پایگاه داده بر اساس CustomerID حذف می کند.

C #

private void DeleteRecord(string CustomerID)

{

    string constr = ConfigurationManager

                .ConnectionStrings["conString"].ConnectionString;

    string query = "delete from TestCustomers " +

                    "where CustomerID=@CustomerID";

    SqlConnection con = new SqlConnection(constr);

    SqlCommand cmd = new SqlCommand(query, con);

    cmd.Parameters.AddWithValue("@CustomerID", CustomerID);

    con.Open();

    cmd.ExecuteNonQuery();

    con.Close();

}

VB.Net

Private Sub DeleteRecord(ByVal CustomerID As String)

    Dim constr As String = ConfigurationManager _

                        .ConnectionStrings("conString").ConnectionString

    Dim query As String = "delete from TestCustomers where" & _

                                " CustomerID=@CustomerID"

    Dim con As New SqlConnection(constr)

    Dim cmd As New SqlCommand(query, con)

    cmd.Parameters.AddWithValue("@CustomerID", CustomerID)

    con.Open()

    cmd.ExecuteNonQuery()

    con.Close()

End Sub

روش ShowMessage

 در روش ShowMessage  میزان رکوردهای حذف شده از طریق هشدار جاوا اسکریپت را نمایش می دهد

C #

private void ShowMessage(int count)

{

    StringBuilder sb = new StringBuilder();

    sb.Append("<script type = 'text/javascript'>");

    sb.Append("alert('");

    sb.Append(count.ToString());

    sb.Append(" records deleted.');");

    sb.Append("</script>");

    ClientScript.RegisterStartupScript(this.GetType(),

                    "script", sb.ToString());

}

VB.Net

Private Sub ShowMessage(ByVal count As Integer)

     Dim sb As New StringBuilder()

     sb.Append("<script type = 'text/javascript'>")

     sb.Append("alert('")

     sb.Append(count.ToString())

     sb.Append(" records deleted.');")

     sb.Append("</script>")

     ClientScript.RegisterStartupScript(Me.GetType(), _

                        "script", sb.ToString())

End Sub

اسکریپت سمت مشتری

من از برخی روشهای جاوا اسکریپت برای روش های زیر استفاده کرده ام

1   چک کردن همه کاراکتر چکشی

2   تایید قبل از حذف

چک کردن همه کاراکتر چکشی

قابلیت check-all checkbox در گذشته قبلا توضیح داده شده است. شما به سادگی می توانید مقاله خود را مطرح کنید

استفاده از جاوا اسکریپت با کنترل GridView ASP.Net

تایید قبل از حذف

این یک ویژگی عالی برای نمایش یک جعبه تأیید به کاربر خواهد بود که نشان می دهد که این تعداد زیادی ردیف یا سوابق انتخاب شده توسط شما حذف می شوند. اگر کاربر فشار دهید OK عملیات حذف را انجام نخواهد داد. عملکرد جاوا اسکریپت زیر این کار را برای ما انجام می دهد.

<script type = "text/javascript">

    function ConfirmDelete()

    {

       var count = document.getElementById("<%=hfCount.ClientID %>").value;

       var gv = document.getElementById("<%=gvAll.ClientID%>");

       var chk = gv.getElementsByTagName("input");

       for(var i=0;i<chk.length;i++)

       {

            if(chk[i].checked && chk[i].id.indexOf("chkAll") == -1)

            {

                count++;

            }

       }

       if(count == 0)

       {

            alert("No records to delete.");

            return false;

       }

       else

       {

            return confirm("Do you want to delete " + count + " records.");

       }

    }

</script>

عکسها

تصاویر زیر نمونه ای از کار  به پایان رسیده را نشان میدهد .

1. انتخاب سوابق متعدد در چند صفحه برای حذف

2. تأیید حذف چند رکورد


3. پیام تایید پس از حذف پرونده

 

 


دانلود
  • لینک های دانلود دوره های آموزشی تا پایان دوره قابل دانلود می باشد.
  • برای خارج کردن فایل ها از حالت فشرده از ورژن جدید نرم افزار winrar استفاده کنید.
  • برای خارج کردن فایل ها از حالت فشرده لینک های دانلودی که چندین قسمت می باشند فقط قسمت اول را از حالت فشرده خارج کنید.
  • لطفا توضیحات نوشته شده برای مطالب را با دقت بخوانید.
  • برای نمایش فیلم ها می توانید از نرم افزار هایی مانند Km Player , VLC Player یا Media Player Classic استفاده کنید.

ارسال نظر
ارسال پیام به :