您的位置:首页 > 编程语言 > ASP

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

2008-05-01 04:43 323 查看
.Jwn104{display:none;} 说起在DataGrid中添加新行ASP.NET开发的大牛人物:DinoEsposito,他的《构建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事件代码:

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事件代码:

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中,如果页脚没有做其他用途的话,这种方式也不失为较好的解决方案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: