حذف سطر از گریدویو (GridView) بدون استفاده از پایگاه داده در Asp.Net

در این مقاله میخواهیم یک سطر از گریدویو (GridView) را حذف کنیم ولی بدون حذف سط از پایگاه داده این عمل انجام میشود برای انجام این عمل ما DataTable را به صورت موقت در ViewState نگهداری میکنیم.

حذف سطر از گریدویو (GridView) بدون استفاده از پایگاه داده در Asp.Net

 حذف سطر از گریدویو (GridView) بدون استفاده از پایگاه داده در Asp.Net

در این مقاله میخواهیم یک سطر از گریدویو (GridView) را حذف کنیم ولی بدون حذف سط از پایگاه داده این عمل انجام میشود برای انجام این عمل ما DataTable را به صورت موقت در ViewState نگهداری میکنیم.

یک پروژه از نوع وب فرم بسازید سپس یک صفحه جدید به پروژه خود اضافه کنید سپس از جعبه ابزار خود یک گرید به صفحه خود اضافه کنید و ستون های گرید را به شکل زیر تنظیم میکنیم:

        <asp:GridView ID="GridView1" CssClass="Grid" runat="server" OnRowDeleting="OnRowDeleting" AutoGenerateColumns="false" OnRowDataBound="OnRowDataBound" EnableModelValidation="True">
            <Columns>
                <asp:BoundField DataField="Item" HeaderText="نام" />
                <asp:BoundField DataField="Price" HeaderText="قیمت" />
                <asp:CommandField ShowDeleteButton="True" ButtonType="Button" DeleteText="حذف" />
        </Columns>
    </asp:GridView>

حال در رویداد PageLoad یک DataTable میسازیم و به آن دو ستون یکی برای نام و یکی برای قیمت اضافه کنید سپس چند سطر به DataTable خود اضافه میکنیم و در آخر DataTable را درون ViewState میریزیم و در آخر متد BindGrid را فراخوانی میکنیم.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            DataTable dt = new DataTable();
            dt.Columns.AddRange(new DataColumn[2] { new DataColumn("Item"), new DataColumn("Price") });
            dt.Rows.Add("پیراهن", 450);
            dt.Rows.Add("شلوار جین", 3200);
            dt.Rows.Add("شلوار پارچه ای", 1900);
            dt.Rows.Add("کراوات", 185);
            dt.Rows.Add("کلاه", 100);
            dt.Rows.Add("کلاه لبه دار", 120);
            dt.Rows.Add("روسری", 290);
            dt.Rows.Add("کمربند", 150);
            ViewState["dt"] = dt;
            BindGrid();
        }
    }

حال در تابع BindGrid باید ViewState را به DataTable تبدیل کنیم سپس مقدار تبدیل شده را در خصوصیت DataSource گرید بریزم:

    protected void BindGrid()
    {
        GridView1.DataSource = ViewState["dt"] as DataTable;
        GridView1.DataBind();
    }

در مرحله بعد در رویداد OnRowDataBound کاری که باید انجام بدیم یک حلقه روی ستون دستورات میزنیم البته باید عمل تبدیل کنترل ها به نوع Button را انجام دهیم سپس درون حلقه در هرسطر چک میکنیم که اگر خصوصیت CommandName برابر Delete بود به دکمه خود   Attribute Onclick را اضافه میکنیم  و درون از شرط یک خطی استفاده کرده و توسط جاوا اسکریپت پیام مناسب را به کاربر نمایش میدهیم و در صورت تایید سطر حذف خواهد شد:

    protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            string item = e.Row.Cells[0].Text;
            foreach (Button button in e.Row.Cells[2].Controls.OfType<Button>())
            {
                if (button.CommandName == "Delete")
                {
                    button.Attributes["onclick"] = "if(!confirm('آیا میخواهید " + item +" را حذف کنید "+ "؟')){ return false; };";
                }
            }
        }
    }

زمانی که روی دکمه حذف کلیک شود رویداد OnRowDeleting اجرا خواهد شد درون این رویداد ابتدا index سطر گرید را پیدا میکنیم سپس یک شی از DataTable ساخته و درون آن  ViewState خود را میریزم البته لازم به ذکر است که ViewState

را باید به نوع DataTable تبدیل کنیم  سپس از DataTable سطر را توسط متد Delete حذف میکنیم و DataTable را مجددا درون ViewState میریزیم و متد BindGrid را فراخوانی میکنیم که اطلاعات گرید به روز شود.

    protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        int index = Convert.ToInt32(e.RowIndex);
        DataTable dt = ViewState["dt"] as DataTable;
        dt.Rows[index].Delete();
        ViewState["dt"] = dt;
        BindGrid();
    }

 

فایل های ضمیمه