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

ASP.NET
asp.net GridView控件中模板列CheckBox全选、反选、取消
asp.net GridView 删除时弹出确认对话框(包括内容提示)
asp.net DropDownList 三级联动下拉菜单实现代码
asp DataTable添加列和行的三种方法
Asp.net 页面调用javascript变量的值
asp.net 长文章通过设定的行数分页
asp.net 定时间点执行任务的简易解决办法
asp.net 页面延时五秒,跳转到另外的页面
asp.net 动态输出透明gif图片
asp.net DataList与Repeater用法区别
asp.net Javascript获取CheckBoxList的value
asp.net程序在调式和发布之间图片路径问题的解决方法
asp.net下生成英文字符数字验证码的代码
asp.net 页面版文本框智能提示JSCode (升级版)
ASP.NET URL伪静态重写实现方法
ASP.NET 2.0 中Forms安全认证
asp.net 动态添加多个用户控件
asp.net Repeater显示父子表数据,无闪烁
asp.net 无法获取的内部内容,因为该内容不是文本 的解决方法
asp.net GridView排序简单实现

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


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