分享
 
 
 

DataGrid入门经典

王朝c#·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

前言:

这篇文章主要介绍如何在DataGrid控件中实现编辑、删除、分类以及分页操作。为了实现我们的意图,我们使用SqlServer2000自带的NorthWind数据库。程序分为两部分:

1.包含HTML代码的.ASPX文件

2.包含所有逻辑及方法的后台C#类文件

代码:

ASPX文件:

在这里我们设计了一个DataGrid对象,我为一些属性和方法作了注解。它就变得如此的简单:

<asp:DataGrid id="MyDataGrid" style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 104px" runat="server"

BorderStyle="Ridge"

GridLines="None"

BorderWidth="2px"

BorderColor="White"

BackColor="White"

CellPadding="3"

CellSpacing="1"

AllowPaging="True" // AllowPaging属性的"True"时, 可进行分页操作

AllowSorting="True" // 这是分类属性

PageSize="15" //设每页25条记录

PagerStyle-Mode="NextPrev" //有2种模式风格:next previous和page numberin

PagerStyle-NextPageText="Next"

PagerStyle-PrevPageText="Previous"

PagerStyle-HorizontalAlign="Center"

PagerStyle-Position="TopAndBottom"

DataKeyField="ProductID" // DataGrid的每条记录都包含一个ProductID字段

OnPageIndexChanged="MyDataGrid_PageIndexChanged" // 当用户进行翻页操作时就激活MyDataGrid_PageIndexChanged函数(function)

OnSortCommand="Sort_Grid" //当用户对DataGrid分类时激活Sort_Grid(function)函数

OnDeleteCommand="MyDataGrid_Delete" //这一事件激活MyDataGrid_Delete函数(function)删除一条记录

OnUpdateCommand="MyDataGrid_Update" //这一事件激活MyDataGrid_Update函数(function)更新一条记录

OnCancelCommand="MyDataGrid_Cancel //这一事件激活MyDataGrid_Cancel函数(function)取消当前操作

OnEditCommand="MyDataGrid_Edit" //这一事件激活MyDataGrid_Edit函数(function)编辑一条记录

AutoGenerateColumns="False" // 设置自动产生行为"False"

HorizontalAlign="Left">

<FooterStyle ForeColor= "Black"BackColor="#C6C3C6"></FooterStyle>

<HeaderStyle Font-Bold= "True" ForeColor= "#E7E7FF"BackColor="#4A3C8C"></HeaderStyle>

<PagerStyle NextPageText="Next" PrevPageText="Previous" HorizontalAlign="Right" ForeColor="Black"

Position= "TopAndBottom"BackColor="#C6C3C6"></PagerStyle>

<SelectedItemStyle Font-Bold= "True" ForeColor= "White"BackColor="#9471DE"></SelectedItemStyle>

<ItemStyle ForeColor= "Black"BackColor="#DEDFDE"></ItemStyle> <Columns>

<asp:EditCommandColumn ButtonType="LinkButton" UpdateText= "<img border=0 src=ok.gif>" CancelText= "<imgborder=0 src=cancel.gif>" EditText= "<imgborder=0src=edit.gif>"></asp:EditCommandColumn>

<asp:ButtonColumn Text= "<img border= 0src= delete.gif>"CommandName="Delete"></asp:ButtonColumn>

<asp:BoundColumn DataField= "ProductID" SortExpression="ProductID" ReadOnly="True" HeaderText= "ProductID"></asp:BoundColumn>

<asp:BoundColumn DataField= "ProductName" SortExpression="ProductName" HeaderText= "ProductName"></asp:BoundColumn>

<asp:BoundColumn DataField="QuantityPerUnit" SortExpression="QuantityPerUnit" HeaderText= "Quantity PerUnit"></asp:BoundColumn>

<asp:BoundColumn DataField="UnitPrice" SortExpression="UnitPrice" HeaderText= "Unit Price"DataFormatString="{0:c}"></asp:BoundColumn>

<asp:BoundColumn DataField="UnitsInStock" SortExpression="UnitsInStock" HeaderText= "Units InStock"></asp:BoundColumn>

<asp:BoundColumn DataField="UnitsOnOrder" SortExpression="UnitsOnOrder" HeaderText= "Units OnOrder"></asp:BoundColumn>

<asp:BoundColumn DataField= "ReorderLevel" SortExpression="ReorderLevel" HeaderText= "ReorderLevel"></asp:BoundColumn>

<asp:TemplateColumn HeaderText="Discontinued" SortExpression="Discontinued">

<ItemTemplate>

<asp:CheckBox id= "Discontinued" runat="server" Checked= '<%# DataBinder.Eval(Container.DataItem, "Discontinued")%>' />

</ItemTemplate>

</asp:TemplateColumn>

</Columns>

</asp:DataGrid>

你看,是不是不难?关键在于我们常动手动脑。多看资料也很关键哦!

C#后台程序:

让我们先看一段程序:

private void Page_Load(object sender, System.EventArgs e)

{

if(!IsPostBack)

{

BindGrid();

}

}

上面展现的是一种非常好的技术,当页面不是PostBack状态时,就绑定数据。这意味着,一旦页面被请求数据将被绑定。

继续看程序:

/// <summary>

/// 这个函数返回关于产品细节的DataSet

/// </summary>

///<returns></returns>

private DataSet GetProductData()

{

///SQLStatement是一个SQL语句(string型的)

string SQLStatement="SELECT Products.ProductID, Products.ProductName, Products.QuantityPerUnit, Products.UnitPrice, "+

"Products.UnitsInStock, Products.UnitsOnOrder, Products.ReorderLevel, Products.Discontinued "+

"FROM Products"; :

///声明 SqlConnection对象:myConnection

SqlConnection myConnection=new SqlConnection(@"server=(local)\NetSDK;”+

”database=NorthWind;uid=northwind;pwd=northwind;");

///声明Command对象:myCommand

SqlDataAdapter myCommand = new SqlDataAdapter(SQLStatement,myConnection);

///设置Command命令的类型为Text类型

myCommand.SelectCommand.CommandType=CommandType.Text;

///创建DataSet对象实例

myDataSet = new DataSet();

///把从表Products返回的数据填充myData

myCommand.Fill(myDataSet, "Products");

///最后返回myDataSet对象

return myDataSet;

}

这段代码执行给定的SQL语句访问数据库,私有函数GetProductData返回一个包含数据记录的DataSet。下一步,让我们看如何编辑记录:

/// <summary>

/// 这个函数只有当用户点击Edit按钮时才会被激活

/// </summary>

/// <paramname="sender"></param>

/// <paramname="E"></param>

protected void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs E)

{

///找出被选定项目的索引(ItemIndex),并且进一步绑定数据

MyDataGrid.EditItemIndex = (int)E.Item.ItemIndex;

BindGrid();

}

通过上面代码所附带的注解大家也能明白MyDataGrid_Edit函数的功能:当用户点击Edit按钮时激活MyDataGrid_Edit函数,并且程序找到所要编辑的记录的索引,把该索引号分配给DataGrid的EditItemIndex属性。

如果用户点击Cancel按钮,将调用我们在上面的.aspx文件中提到的MyDataGrid_Cancel函数,程序如果分配给DataGrid属性 EditItemIndex的值为-1,就意味着用户没有选择Edit,程序如下:

/// <summary>

/// 用户点击Cancel按钮时激活MyDataGrid函数

/// </summary>

/// <paramname="sender"></param>

/// <paramname="E"></param>

protected void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs E)

{

MyDataGrid.EditItemIndex = -1;

BindGrid();

}

下面的代码像我们展现了如何从DataGrid中删除一条选中的记录。我们知道Web控件DataGrid有一DataKeyField属性,事实上它就包含了每条记录的ProductID字段值。您一定会问如何通过DataKeyField属性得到DataGrid中选中记录的ProductID值呢?下面这段代码会让您释然的:

-----

int ProductID =(int)MyDataGrid.DataKeys[(int)E.Item.ItemIndex];

-----

MyDataGrid_Delete函数代码如下:

/// <summary>

///从DataSet中删除一条记录

/// </summary>

/// <param name="sender"></param>

/// <param name="E"></param>

protected void MyDataGrid_Delete(Object sender, DataGridCommandEventArgs E)

{

int ProductID =(int)MyDataGrid.DataKeys[(int)E.Item.ItemIndex];

string SQLStatement="Delete Products WHERE ProductID="+ProductID;

string myConnectionString = "server=localhost;uid=sa;pwd=;database=NorthWind";

SqlConnection myConnection = new SqlConnection(myConnectionString);

SqlCommand myCommand = new SqlCommand (SQLStatement,myConnection);

myCommand.CommandTimeout = 15;

myCommand.CommandType=CommandType.Text;

try

{

myConnection.Open();

myCommand.ExecuteNonQuery();

myConnection.Close();

}

catch(Exception ee)

{

throw ee;

}

MyDataGrid.EditItemIndex = -1;

BindGrid();

}

下面的代码用来更新NorthWind数据库的产品信息,

我们可以使用下面这项技术检索值:

-------------------

bool Discon=((CheckBox)E.Item.FindControl("Discontinued")).Checked;

-------------------

这时我们使用FinControl()方法就能得到Discontinued CheckBox的值.

/// <summary>

///更新记录

/// </summary>

/// <param name="sender"></param>

/// <param name="E"></param>

protected void MyDataGrid_Update(Object sender, DataGridCommandEventArgs E)

{

int ProductID =(int)MyDataGrid.DataKeys[(int)E.Item.ItemIndex];

string ProductName = ((TextBox)E.Item.Cells[3].Controls[0]).Text;

string QuantityPerUnit=((TextBox)E.Item.Cells[4].Controls[0]).Text;

string UnitPrice = ((TextBox)E.Item.Cells[5].Controls[0]).Text;

Int16 UnitsInStock=Int16.Parse(((TextBox)E.Item.Cells[6].Controls[0]).Text);

Int16 UnitsOnOrder=Int16.Parse(((TextBox)E.Item.Cells[7].Controls[0]).Text);

Int16 ReorderLevel=Int16.Parse(((TextBox)E.Item.Cells[8].Controls[0]).Text);

bool Discon=((CheckBox)E.Item.FindControl("Discontinued")).Checked;

int result;

if(!Discon)

{

result=0;

}

else

{

result=1;

}

string SQLStatement="UPDATE Products "+

"SET ProductName='"+ProductName+"', "+

"QuantityPerUnit='"+QuantityPerUnit+"', "+

"UnitPrice ="+UnitPrice.Substring(UnitPrice.IndexOf("¥")+1)+", "+

"UnitsInStock ="+UnitsInStock+", "+

"UnitsOnOrder ="+UnitsOnOrder+", "+

"ReorderLevel ="+ReorderLevel+", "+

"Discontinued ="+result+

" WHERE ProductID ="+ProductID;

string myConnectionString = "server=localhost;uid=xjb;pwd=xjb;database=Northwind";

SqlConnection myConnection = new SqlConnection(myConnectionString);

SqlCommand myCommand = new SqlCommand(SQLStatement,myConnection);

myCommand.CommandTimeout = 15;

myCommand.CommandType = CommandType.Text;

try

{

myConnection.Open();

myCommand.ExecuteNonQuery();

myConnection.Close();

}

catch(Exception ee)

{

throw ee

}

MyDataGrid.EditItemIndex = -1;

BindGrid();

}

接下来的BindGrid()调用私有函数GetProductData取得DataSet对象并绑定到DataGrid控件。

/// <summary>

/// 接受数据库数据并再次绑定

/// </summary>

protected void BindGrid()

{

MyDataGrid.DataSource=GetProductData().Tables["Products"].DefaultView;

MyDataGrid.DataBind();

}

用户在DataGrid中向前或向后移动时激活MyDataGrid_PageIndexChanged事件,因为DataGrid 不能自动的获取新页的索引号,所以我们只能手动取得索引号。

/// <summary>

/// 分页操作

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void MyDataGrid_PageIndexChanged(object source, DataGridPageChangedEventArgs e)

{

MyDataGrid.CurrentPageIndex=e.NewPageIndex;

BindGrid();

}

用户在任何时候想对数据分类时,就激活下面的Sort_Grid事件。例如,如果用户点击field headers,事件就将被激活,并且把数据分成我们想要的分类。 我们需要DataView对象去为e.SortExpression.ToString()方法分类,返回的是被点击域标题的分类。

/// <summary>

/// 分类

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void Sort_Grid(Object sender, DataGridSortCommandEventArgs e)

{

DataView dv= new DataView(GetProductData().Tables["Products"]);

dv.Sort= e.SortExpression.ToString();

MyDataGrid.DataSource=dv;

MyDataGrid.DataBind();

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有