再议ASP.NET DataGrid控件中的“添加新行”功能_.Net教程
推荐:AJAX实现web页面中级联菜单的设计 看了大峡搞的级联菜单,我也班门弄斧一把,嘿嘿,花了一点时间搞了个级联菜单贴上来看看。本例中只要你选择成员分类名称就会自动显示成员名称: 首先在eclipse中建一个项目,名称你自
说起在DataGrid中添加新行,ASP.NET开发的大牛人物:Dino Esposito,他的《构建WEB解决方案--应用ASP.NET和ADO.NET》一书中提供了和以上两位类似的方法,但是Dino又加了些功能,首先就是”添加新行“这个LinkButton放在页脚,同时这个LinkButton在分页到最后一页时才启用,因为在其他页面添加新行是不可取的;其次是添加的行如果引起分页,就切换到新页并进入此行的编辑模式。
前一段时间,我也使用了这个功能,发现仍然存在两个问题:
1.点击”添加新行“按钮编辑新行时,如果再次点击”添加新行“的话,这个刚添加的新行会变成空白,编辑模式会进入另外的新行。
2.在翻页时DataGrid的EditItemIndex没有恢复成-1,会造成其他页面相同索引的行也进入编辑模式。
于是就操刀稍稍修改了一下,解决了这两个问题,最终效果是这样的:
图一:不在最后一页时,添加新行按钮不可用
图二:在最后一页时,按钮才可用
图三:当新加行进入编辑模式后,按钮再次不可点击,取消后此新增行会删除,恢复到图二
页脚模板中的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中,如果页脚没有做其他用途的话,这种方式也不失为较好的解决方案。
分享:妙用ASP2.0中的URL映射改变网址 URL映射有什么用呢? 举个比较实用的例子,比如你开发一个Blog网站, 每个Blog主页的加载地址是 www.blog.com/Default.aspx?id=anckly Default页通过id来
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP发送Email实例(可带附件)
- js实现广告漂浮效果的小例子
- asp.net Repeater 数据绑定的具体实现
- Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
- Asp.net获取客户端IP常见代码存在的伪造IP问题探讨
- VS2010 水晶报表的使用方法
- ASP.NET中操作SQL数据库(连接字符串的配置及获取)
- asp.net页面传值测试实例代码
- DataGridView - DataGridViewCheckBoxCell的使用介绍
- asp.net中javascript的引用(直接引入和间接引入)
- 三层+存储过程实现分页示例代码
- 相关链接:
- 教程说明:
.Net教程-再议ASP.NET DataGrid控件中的“添加新行”功能。