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

استفاده از کنترل Gridview در انتخاب و حذف چندین ردیف با ASP.Net
0 0
استفاده از کنترل Gridview در انتخاب و حذف چندین ردیف با ASP.Net

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

این مثال  ASP.Net 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" />

 

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

داده های اتصال کنترل ASP.Net GridView

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

SELECT * INTO TestCustomers

FROM Customers

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

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 ASP.Net به روش زیر فراخوانی می شود :

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 به حلقه می رویم و در صورتی که رکورد در فهرست Array وجود داشته باشد، آن را با استفاده از روش DeleteRecord حذف می کند. در نهایت یک جعبه هشدار جاوااسکریپت را نشان می دهیم تا کاربر را مطلع کند که عملیات حذف با استفاده از روش ShowMessage به پایان رسیده است

روش DeleteRecord

روش DeleteRecord به سادگی رکورد را از جدول پایگاه داده بر اساس 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

اسکریپت Client Side

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

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 استفاده کنید.

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