当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 再议ASP.NET DataGrid控件中的“添加新行”功能

ASP.NET
C#中使Datawindow.Net组件处理数据
在.net开发中几个重要的认识误区(1)
WML教程11:文本框控件(Input)
WML教程6:动作和链接
在WEB自定义控件中实现事件及自动保存值
WML教程14:WML 文本处理
表单启动太慢时显示一个等待图标(类似Windows下的时间沙漏)
ADO.NET学习笔记(二)
使用HttpContext中的User属性来实现用户身份验证之用户验证票篇
由DataGrid翻页所导致的诸多问题的解决方案
动态加载类的原理:元数据的使用
用C#实现Des加密和解密
快速对图片进行滤光处理
可以代替窗体Refresh方法的函数
『原创』适合初学的简单3D碰撞检测初探(对于3D编程初学人员)
《Essential .Net》读书笔记 - Chapter 3
Lion.Web.WebHtmlEditor 1.0 Hack 攻略
数据库事务处理的另外一种方法
[WSE]Web Service—后台侦听服务通过WSE2.0建立订阅/发布关系
给windows服务添加描述

再议ASP.NET DataGrid控件中的“添加新行”功能


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 106 ::
收藏到网摘: n/a

  说起在DataGrid中添加新行,ASP.NET开发的大牛人物:Dino Esposito,他的《构建WEB解决方案--应用ASP.NET和ADO.NET》一书中提供了和以上两位类似的方法,但是Dino又加了些功能,首先就是”添加新行“这个LinkButton放在页脚,同时这个LinkButton在分页到最后一页时才启用,因为在其他页面添加新行是不可取的;其次是添加的行如果引起分页,就切换到新页并进入此行的编辑模式。


  前一段时间,我也使用了这个功能,发现仍然存在两个问题:


  1.点击”添加新行“按钮编辑新行时,如果再次点击”添加新行“的话,这个刚添加的新行会变成空白,编辑模式会进入另外的新行。


  2.在翻页时DataGrid的EditItemIndex没有恢复成-1,会造成其他页面相同索引的行也进入编辑模式。
 

  于是就操刀稍稍修改了一下,解决了这两个问题,最终效果是这样的:


  图一:不在最后一页时,添加新行按钮不可用


  图二:在最后一页时,按钮才可用


  图三:当新加行进入编辑模式后,按钮再次不可点击,取消后此新增行会删除,恢复到图二


  页脚模板中的LinkButton:

以下为引用的内容:

<FooterTemplate>
                                
<asp:LinkButton id=lbAddNewRow runat="server" CommandName="AddNewRow" Enabled="<%# IsEnableAddNewRow() %>">添加新行</asp:LinkButton>
                            
</FooterTemplate>

  页面代码中IsEnableAddNewRow方法代码:

以下为引用的内容:
1 protected bool IsEnableAddNewRow()
2         {
3             //只有最后一页并不在编辑模式时才启用添加新行功能
4             return (dgData.CurrentPageIndex == dgData.PageCount - 1&&dgData.EditItemIndex == -1);
5         }

  页面代码中ItemCommand事件代码:

以下为引用的内容:
1 private void dgData_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
 2         {
 3             if(e.CommandName == "AddNewRow")
 4             {
 5                 //先在数据源添加新行,如果有主键字段,还需要考虑主键字段的数据生成和最后更新时的提交
 6                 LoadData();
 7                 DataRow newRow = dsData.Tables[0].NewRow();                
 8                 dsData.Tables[0].Rows.Add(newRow);
 9                 dgData.DataSource = dsData;
10                 Session["myData"= dsData;
11                 //判断添加此行后是否应该换页                
12                 int currentIndex = dgData.Items.Count;
13                 if(currentIndex >= dgData.PageSize)
14                 {
15                     dgData.CurrentPageIndex ++;
16                     currentIndex = 0;
17                 }                
18                 dgData.EditItemIndex = currentIndex;                
19                 dgData.DataBind();
20                 dgData.Items[currentIndex].Attributes.Add("IsNewItem","True");
21             }
22         }

  CancelCommand事件代码:

以下为引用的内容:
1 private void dgData_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
 2         {
 3             LoadData();
 4             //如果在新增行选择取消,则拒绝添加此行
 5             if(e.Item.Attributes["IsNewItem"!= null && e.Item.Attributes["IsNewItem"== "True")
 6             {
 7                 dsData.RejectChanges();
 8                 Session["myData"= dsData;
 9             }                        
10             dgData.EditItemIndex = -1;
11             BindGrid(dgData.CurrentPageIndex);
12         }

 

  以上的例子我写了一个Demo,打包好的解决方案文件可以在这里下载(注意修改Web.config文件中的连接字符串,数据访问代码在DataAccess类中)。

 

  在写这篇Post的途中,有朋友建议在DataGrid的页脚为每个字段放置一个文本框,然后再放置一个“添加此行”按钮,点击按钮后即可将行添加到DataGrid中,如果页脚没有做其他用途的话,这种方式也不失为较好的解决方案。