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

ویرایش Bulk چندین ردیف در GridView با استفاده از CheckBoxes در ASP.Net
0 0
ویرایش Bulk چندین ردیف در GridView با استفاده از CheckBoxes در ASP.Net

 با سلام در این مقاله توضیح خواهیم داد که چگونه چندین ردیف را در GridView با استفاده از CheckBox ها ویرایش و به روز رسانی کنید .
 پایگاه داده و رشته اتصال
برای این کار باید پایگاه داده Northwind را با استفاده از لینک زیر دانلود کنید
دانلود Northwind پایگاه داده
در زیر رشته اتصال از فایل Web.Config است

<connectionStrings>
 <addname="constring"connectionString="Data Source=.\SQL2005;Initial Catalog=NorthWind;integrated security=true"/>
</connectionStrings>

کد HTML
در کد HTML زیر،  GridView ساده 3 ستون دارد. ستون اول حاوی CheckBox، ستون دوم حاوی برچسب و TextBox به ترتیب برای نمایش و ویرایش ارتباط نام مشتری و ستون سوم حاوی برچسب و DropDownList برای نمایش و ویرایش کشور از مشتری است .
همچنین از propertyKeyNames برای ذخیره کلید اولیه یعنی CustomerId استفاده کردیم  

<asp:GridView ID="gvCustomers" runat="server" AutoGenerateColumns="false" OnRowDataBound = "OnRowDataBound" DataKeyNames = "CustomerId">
    <Columns>
        <asp:TemplateField>
            <HeaderTemplate>
                <asp:CheckBox ID = "chkAll" runat="server" AutoPostBack="true" OnCheckedChanged="OnCheckedChanged" />
            </HeaderTemplate>
            <ItemTemplate>
                <asp:CheckBox runat="server" AutoPostBack="true" OnCheckedChanged="OnCheckedChanged" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Contact Name" ItemStyle-Width = "150">
            <ItemTemplate>
                <asp:Label runat="server" Text='<%# Eval("ContactName") %>'></asp:Label>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("ContactName") %>' Visible="false"></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Country" ItemStyle-Width = "150">
            <ItemTemplate>
                <asp:Label ID = "lblCountry" runat="server" Text='<%# Eval("Country") %>'></asp:Label>
                <asp:DropDownList ID="ddlCountries" runat="server" Visible = "false">
                </asp:DropDownList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
<br />
<asp:Button ID="btnUpdate" runat="server" Text="Update" OnClick = "Update" Visible = "false"/>

فضاهای نام
شما باید فضای نامهای زیر را وارد کنید
C #

using System.Data;
using System.Linq;
using System.Configuration;
using System.Data.SqlClient;

VB.Net

Imports System.Data
Imports System.Linq
Imports System.Configuration
Imports System.Data.SqlClient

اتصال GridView
در زیر کد  اتصال کنترل GridView با سوابق از جدول مشتریان پایگاه Northwind است.
C #

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        this.BindGrid();
    }
}
 
private void BindGrid()
{
    SqlCommand cmd = new SqlCommand("SELECT CustomerId, ContactName, Country FROM Customers");
    gvCustomers.DataSource = this.ExecuteQuery(cmd, "SELECT");
    gvCustomers.DataBind();
}
 
private DataTable ExecuteQuery(SqlCommand cmd, string action)
{
    string conString = ConfigurationManager.ConnectionStrings["constring"].ConnectionString;
    using (SqlConnection con = new SqlConnection(conString))
    {
        cmd.Connection = con;
        switch (action)
        {
            case "SELECT":
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    sda.SelectCommand = cmd;
                    using (DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        return dt;
                    }
                }
            case "UPDATE":
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
                break;
        }
        return null;
    }
}

VB.Net

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    If Not IsPostBack Then
        Me.BindGrid()
    End If
End Sub
 
Private Sub BindGrid()
    Dim cmd As New SqlCommand("SELECT CustomerId, ContactName, Country FROM Customers")
    gvCustomers.DataSource = Me.ExecuteQuery(cmd, "SELECT")
    gvCustomers.DataBind()
End Sub
 
Private Function ExecuteQuery(cmd As SqlCommand, action As String) As DataTable
    Dim conString As String = ConfigurationManager.ConnectionStrings("constring").ConnectionString
    Using con As New SqlConnection(conString)
        cmd.Connection = con
        Select Case action
            Case "SELECT"
                Using sda As New SqlDataAdapter()
                    sda.SelectCommand = cmd
                    Using dt As New DataTable()
                        sda.Fill(dt)
                        Return dt
                    End Using
                End Using
            Case "UPDATE"
                con.Open()
                cmd.ExecuteNonQuery()
                con.Close()
                Exit Select
        End Select
        Return Nothing
    End Using
End Function

جمع آوری کشور DropDownList درحالت GridView
در OnRowDataBoundevent از GridView جمع آوری کشور DropDownList وقتی که یک ردیف ویرایش شود نمایش داده خواهد شد.
C #

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        SqlCommand cmd = new SqlCommand("SELECT DISTINCT(Country) FROM Customers");
        DropDownList ddlCountries = (e.Row.FindControl("ddlCountries") as DropDownList);
        ddlCountries.DataSource = this.ExecuteQuery(cmd, "SELECT");
        ddlCountries.DataTextField = "Country";
        ddlCountries.DataValueField = "Country";
        ddlCountries.DataBind();
        string country = (e.Row.FindControl("lblCountry") as Label).Text;
        ddlCountries.Items.FindByValue(country).Selected = true;
    }
}

VB.Net

Protected Sub OnRowDataBound(sender As Object, e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim cmd As New SqlCommand("SELECT DISTINCT(Country) FROM Customers")
        Dim ddlCountries As DropDownList = TryCast(e.Row.FindControl("ddlCountries"), DropDownList)
        ddlCountries.DataSource = Me.ExecuteQuery(cmd, "SELECT")
        ddlCountries.DataTextField = "Country"
        ddlCountries.DataValueField = "Country"
        ddlCountries.DataBind()
        Dim country As String = TryCast(e.Row.FindControl("lblCountry"), Label).Text
        ddlCountries.Items.FindByValue(country).Selected = True
    End If
End Sub

تغییر حالت ردیف GridView در حالت ویرایش در CheckBox
 رویداد handler زیر هنگام چک کردن ردیف GridView و یا بدون آن کنترل می شود و هنگامی که Check All CheckBox در ردیف GridView  سرصفحه بررسی می شود د.
در اینجا از طریق ردیف GridView  حلقه می کنیم و بررسی می کنیم که CheckBox برای آن ردیف بررسی شده است. اگر CheckBox چک شود، کنترل Label در GridView Cell پنهان شده و TextBox یا DropDownList مربوطه قابل مشاهده است.
در نهایت مطمئن هستیم که دکمه Update btnUpdate تنها زمانی قابل مشاهده است که حداقل یک چک باکس بررسی شود.
C #

protected void OnCheckedChanged(object sender, EventArgs e)
{
    bool isUpdateVisible = false;
    CheckBox chk = (sender as CheckBox);
    if (chk.ID == "chkAll")
    {
        foreach (GridViewRow row in gvCustomers.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                row.Cells[0].Controls.OfType<CheckBox>().FirstOrDefault().Checked = chk.Checked;
            }
        }
    }
    CheckBox chkAll = (gvCustomers.HeaderRow.FindControl("chkAll") as CheckBox);
    chkAll.Checked = true;
    foreach (GridViewRow row in gvCustomers.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            bool isChecked = row.Cells[0].Controls.OfType<CheckBox>().FirstOrDefault().Checked;
            for (int i = 1; i < row.Cells.Count; i++)
            {
                row.Cells[i].Controls.OfType<Label>().FirstOrDefault().Visible = !isChecked;
                if (row.Cells[i].Controls.OfType<TextBox>().ToList().Count > 0)
                {
                    row.Cells[i].Controls.OfType<TextBox>().FirstOrDefault().Visible = isChecked;
                }
                if (row.Cells[i].Controls.OfType<DropDownList>().ToList().Count > 0)
                {
                    row.Cells[i].Controls.OfType<DropDownList>().FirstOrDefault().Visible = isChecked;
                }
                if (isChecked && !isUpdateVisible)
                {
                    isUpdateVisible = true;
                }
                if (!isChecked )
                {
                    chkAll.Checked = false;
                }
            }
        }
    }
    btnUpdate.Visible = isUpdateVisible;
}

VB.Net

Protected Sub OnCheckedChanged(sender As Object, e As EventArgs)
    Dim isUpdateVisible As Boolean = False
    Dim chk As CheckBox = TryCast(sender, CheckBox)
    If chk.ID = "chkAll" Then
        For Each row As GridViewRow In gvCustomers.Rows
            If row.RowType = DataControlRowType.DataRow Then
                row.Cells(0).Controls.OfType(Of CheckBox)().FirstOrDefault().Checked = chk.Checked
            End If
        Next
    End If
    Dim chkAll As CheckBox = TryCast(gvCustomers.HeaderRow.FindControl("chkAll"), CheckBox)
    chkAll.Checked = True
    For Each row As GridViewRow In gvCustomers.Rows
        If row.RowType = DataControlRowType.DataRow Then
            Dim isChecked As Boolean = row.Cells(0).Controls.OfType(Of CheckBox)().FirstOrDefault().Checked
            For i As Integer = 1 To row.Cells.Count - 1
                row.Cells(i).Controls.OfType(Of Label)().FirstOrDefault().Visible = Not isChecked
                If row.Cells(i).Controls.OfType(Of TextBox)().ToList().Count > 0 Then
                    row.Cells(i).Controls.OfType(Of TextBox)().FirstOrDefault().Visible = isChecked
                End If
                If row.Cells(i).Controls.OfType(Of DropDownList)().ToList().Count > 0 Then
                    row.Cells(i).Controls.OfType(Of DropDownList)().FirstOrDefault().Visible = isChecked
                End If
                If isChecked AndAlso Not isUpdateVisible Then
                    isUpdateVisible = True
                End If
                If Not isChecked Then
                    chkAll.Checked = False
                End If
            Next
        End If
    Next
    btnUpdate.Visible = isUpdateVisible
End Sub

به روز رسانی رکورد ویرایش شده در ردیف GridView
 رویداد handler  زیر وقتی دکمه Update بر روی btnUpdate کلیک می شود اجرا می شود.
در اینجا از طریق ردیف GridView حلقه و بررسی می کنیم که CheckBox برای آن ردیف چک شده است. اگر CheckBox چک شود، مقادیر ویرایش شده از TextBox و کنترل های DropDownList به پارامترهای SQL اضافه می شوند و رکورد در پایگاه داده بر اساس CustomerId در Property DataKeyNames به روز می شود
C #

protected void Update(object sender, EventArgs e)
{
    foreach (GridViewRow row in gvCustomers.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            bool isChecked = row.Cells[0].Controls.OfType<CheckBox>().FirstOrDefault().Checked;
            if (isChecked)
            {
                SqlCommand cmd = new SqlCommand("UPDATE Customers SET ContactName = @ContactName, Country = @Country WHERE CustomerId = @CustomerId");
                cmd.Parameters.AddWithValue("@ContactName", row.Cells[1].Controls.OfType<TextBox>().FirstOrDefault().Text);
                cmd.Parameters.AddWithValue("@Country", row.Cells[2].Controls.OfType<DropDownList>().FirstOrDefault().SelectedItem.Value);
                cmd.Parameters.AddWithValue("@CustomerId", gvCustomers.DataKeys[row.RowIndex].Value);
                this.ExecuteQuery(cmd, "SELECT");
            }
        }
    }
    btnUpdate.Visible = false;
    this.BindGrid();
}

VB.Net

Protected Sub Update(sender As Object, e As EventArgs)
    For Each row As GridViewRow In gvCustomers.Rows
        If row.RowType = DataControlRowType.DataRow Then
            Dim isChecked As Boolean = row.Cells(0).Controls.OfType(Of CheckBox)().FirstOrDefault().Checked
            If isChecked Then
                Dim cmd As New SqlCommand("UPDATE Customers SET ContactName = @ContactName, Country = @Country WHERE CustomerId = @CustomerId")
                cmd.Parameters.AddWithValue("@ContactName", row.Cells(1).Controls.OfType(Of TextBox)().FirstOrDefault().Text)
                cmd.Parameters.AddWithValue("@Country", row.Cells(2).Controls.OfType(Of DropDownList)().FirstOrDefault().SelectedItem.Value)
                cmd.Parameters.AddWithValue("@CustomerId", gvCustomers.DataKeys(row.RowIndex).Value)
                Me.ExecuteQuery(cmd, "SELECT")
            End If
        End If
    Next
    btnUpdate.Visible = False
    Me.BindGrid()
End Sub

عکس روی صفحه

 


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

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