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

在园子里搜索了一下,发现不管是panchengyong的“ 在DataGrid快速添加新行(c#) ”还是piccolo的” 在DataGrid快速添加新行“,都只是简单的实现了添加新行,功能上还是有改进的余地。

说起在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中,如果页脚没有做其他用途的话,这种方式也不失为较好的解决方案。
备注:本文引用自 http://www.cnblogs.com/xlzhu/archive/2007/04/19/718679.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值