在园子里搜索了一下,发现不管是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中,如果页脚没有做其他用途的话,这种方式也不失为较好的解决方案。