تو یکی از پروژه هایی که داشتم برای یک مدرسه انجام میدادم صفحه ای رو میخواستم که نمرات دانش آموزان رو وارد و یا ویرایش کنم، خوب میدونیم که برای این کار به راحتی با داشتن شماره دانش آموزش میشد همچین کاری رو انجام داد اما برای هر دانش آموز باید این روند تکرار میشد و کاربر رایانه مدرسه لیستی میخواست که نام دانش آموز رو نمایش بده و جلوش تکست باکسی باشه برای تغییر نمره!
چند تا راه وجود داشت اما بهترین راهش رو در این مقاله بررسی میکنیم.
در این مقاله سعی میکنیم به دو هدف زیر برسیم:
1 - دسترسی به کنترل تکست باکس درون تمپلت فیلد گریدویو
2 - دسترسی به مقادیر داخل یک سلول از گریدویو
کاری که قراره انجام بشه :
ویرایش جدول منوها به صورت گروها(تعداد بالا)
اسکریپت جدول منوها :
کد:
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TBL_Menus](
[MenuID] [int] IDENTITY(1,1) NOT NULL,
[MenuTitle] [nvarchar](50) NOT NULL,
[MenuUrl] [nvarchar](250) NOT NULL,
CONSTRAINT [PK_TBL_Menus] PRIMARY KEY CLUSTERED
(
[MenuID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
یک مدل درست کردم و جدول رو وارد کردم، یک گرید ویو و یک دکمه تو صفحه قرار میدم و گریدم رو بایند میکنم :
کد:
<div>
<asp:GridView runat="server" ID="grdMenus" AutoGenerateColumns="False">
<Columns>
<asp:BoundField HeaderText="Menu ID" DataField="MenuID"/>
<asp:BoundField HeaderText="Title" DataField="MenuTitle"/>
<asp:TemplateField HeaderText="Menu Url">
<ItemTemplate>
<asp:TextBox runat="server" ID="txt" Text='<%# Eval("MenuUrl") %>'/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button runat="server" ID="btnSubmit" Text="Submit Changes" OnClick="btnSubmit_Click"/>
</div>
و صفحه کد بیهاند به صورت زیر میشه :
کد:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AccessControlsInsideGridview.Model;
namespace AccessControlsInsideGridview
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindGrid();
}
}
public void BindGrid()
{
var context = new MenuEntities();
grdMenus.DataSource = (from m in context.TBL_Menus orderby m.MenuID descending select m).ToList();
grdMenus.DataBind();
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
var context = new MenuEntities();
int i = 0;
foreach (GridViewRow row in grdMenus.Rows)
{
int mid = Convert.ToInt32(grdMenus.Rows[i].Cells[0].Text);
var menu = (from m in context.TBL_Menus where m.MenuID == mid select m).FirstOrDefault();
if (!string.IsNullOrEmpty(((TextBox)row.FindControl("txt")).Text))
{
if (menu != null)
{
menu.MenuUrl = ((TextBox)row.FindControl("txt")).Text;
}
}
i += 1;
}
context.SaveChanges();
BindGrid();
}
}
}
همونطور که میبینیم شمارنده ای به نام i تعریف کردیم و مقدار اون رو برابر صفر قرار دادیم.
به تعداد ردیف های گریدویو عملیاتی رو تکرار میکنیم، که در این عملیات مقدار درون سلول اول رو به متغیری به نام mid که همون شماره منو یا MenuID در جدول هست میده بعد ردیف ی از جدول که شماره منو اون برابر مقدار بدست اومده هست رو پیدا میکنیم و در مرجله بعد مقدار تکست باکس رو به جای ستون MenuUrl قرار میدیم و تغییرات رو سیو میکنیم.
موفق باشید