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

ASP.NET
ASP.NET开发:简化应用程序的开发支持Web标准
asp.net XMLHttpRequest实现用户注册前的验证
asp.net 页面间传值方法小结
asp.net url重写浅谈
asp.net 验证码生成和刷新及验证
C#精髓 GridView72大绝技 学习gridview的朋友必看
实例说明asp.net中的简单角色权限控制
asp.net网站开发包wq.dll打包下载
js与ASP.NET 中文乱码问题
asp.net checkbox 动态绑定id GridView删除提示
asp.net TextBox回车触发事件 图片在img显示
asp.net 脏字典过滤问题 用正则表达式来过滤脏数据
asp.NET 脏字过滤算法
asp.NET 脏字过滤算法 修改版
asp.net sql 数据库处理函数命令
asp.net Javascript 的几种写法与提示
ASP.NET MVC学习笔记
asp.net 中国身份证号码验证代码 非正则
Asp.net中使用Sqlite数据库的方法
asp.net 中文字符串提交乱码的解决方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 41 ::
收藏到网摘: 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中,如果页脚没有做其他用途的话,这种方式也不失为较好的解决方案。