在GRIDVIEW底部增加一空行.方案一经采用,另开贴再送100分!说到做到!

msnadair 2010-03-29 04:13:29
需求:
1.一个GRIDVIEW,有多列! 其中有三列是:身份证号,工号,姓名。这三列都是模板列,放有TEXTBOX。

2.查询出的员工信息显示在这个GRIDVIEW中,

3.在表格外面,有个按钮“增加一行”。点击此按钮,就在GRIDVIEW底部出现一空行!

4.在空行的列:身份证号,工号,姓名的文本框中,可以输入信息,例如输入工号,则根据工号带出员工信息。


实现要求:
1.添加空行要求只刷新表格! 不刷新整个页面!


另外:我用JS实现过,就是获取页面上的表格,再添加一个<TR>...</TR>. 获取员工信息,也是采用JS。

但其维护性,可扩展性不好! 因为,如果要求在某列前再添加一列信息,那么之前定义的obj.rows[i].cells[j]都变了!都得改! 太烦了!


所以特此发贴,高分求行之有效的方法! 谢谢!!!


...全文
782 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyp19870608 2011-06-27
  • 打赏
  • 举报
回复
是啊,我也遇到这样的问题,等待解决中。。。
我的我的 2011-05-01
  • 打赏
  • 举报
回复
问一下楼主,第四中方法是怎么实现的呢?
netchildren 2010-04-01
  • 打赏
  • 举报
回复
学习 路过
msnadair 2010-04-01
  • 打赏
  • 举报
回复
这一贴给谈及到这四种方法中的朋友加分!

第四种方法首先提出来的是"zzxap",请"zzxap"进我的另一贴领取100分!贴子名称为:"GRIDVIEW添加空行最佳实践加分贴"

再次谢谢各位朋友的帮忙!
msnadair 2010-04-01
  • 打赏
  • 举报
回复
我总结一下各位的方案:
1.使用JS写表格行对象的HTML.
评价:这种方法脚本代码量大,可维护性,可扩展性差!
2.使用GRIDVIEW的FOOTROW.
评价:这种方法适用于表格中的多列需要输入信息.实现起来有小小复杂,特别是如果还有多列统计列!
3.使用LISTVIEW数据控件
评价:据说这种方法很方便添加新行,但我没试过
4.使用DIV将要输入的信息列示成标签和输入控件.在DIV中输入的数据再绑定到GRIDVIEW中.
评价:这种方法适用于大部分的场景,实现简单,方便,快捷!一般其要求表格中需求可输入列在少量.

我现在是采用了第四种方法! 第四种方法加上AJAX的局部刷新技术,可以达到很好的效果!

谢谢!!!
likevs 2010-03-31
  • 打赏
  • 举报
回复
路过,学习中
msnadair 2010-03-31
  • 打赏
  • 举报
回复
非常感谢楼上的朋友提供LISTVIEW这个方法!
我会尝试用一下!

但是,由于我们现在系统里用的都是我们包装好了的GRIDVIEW, 我这次算是属于重构一下!
暂时系统里不准备使用LISTVIEW,但如果LISTVIEW在添加空行方便如何便捷,将不排除往后的需求中引进。
ddc100565 2010-03-31
  • 打赏
  • 举报
回复
为什么不用ListVIEW呢,这是很好的东西啊!

<asp:ListView ID="ListView1" runat="server" DataKeyNames="PK_TYPE_ID"
InsertItemPosition="LastItem"
DataSourceID="SqlDataSource2"
>
<ItemTemplate>
<tr style="border:1px solid #eee">

<td style="border:1px solid #eee; width:25%">
<asp:Label ID="PK_TYPE_IDLabel" runat="server"
Text='<%# Eval("PK_TYPE_ID") %>' />
</td>
<td style="border:1px solid #eee; width:50%;">
<asp:Label ID="NAMELabel" runat="server" Text='<%# Eval("NAME") %>' />
</td>

<td style="border:1px solid #eee; width:25%">
<asp:LinkButton ID="EditButton" runat="server" CommandName="Edit">编辑</asp:LinkButton>   
<%-- <asp:Button ID="" runat="server" CommandName="Edit" Text="" CssClass="ImgBtn"/>
<asp:Button ID="DeleteButton" runat="server" CommandName="Delete" OnClientClick="return confirm('您确认删除该记录吗?')" Text="删除" CssClass="ImgBtn"/>--%>
<asp:LinkButton ID="DeleteButton" runat="server" CommandName="Delete" OnClientClick="return confirm('您确认删除该记录吗?')">删除</asp:LinkButton>
</td>
</tr>
</ItemTemplate>

<EmptyDataTemplate>
<table runat="server" style="">
<tr>
<td>
未返回数据。</td>
</tr>
</table>
</EmptyDataTemplate>
<InsertItemTemplate>
<tr style="">

<td style="border:1px solid #eee;width:25%">
<asp:Label ID="PK_TYPE_IDTextBox" runat="server"
Text="此处自动生成" />
</td>
<td style="border:1px solid #eee;width:50%">
<asp:TextBox ID="NAMETextBox" MaxLength="15" runat="server" Text='<%# Bind("NAME") %>' Width="90%" style="word-wrap: break-word; word-break: break-all;"/>
</td>

<td style="border:1px solid #eee;width:25%">
<asp:LinkButton ID="InsertButton" runat="server" CommandName="Insert">插入</asp:LinkButton>   
<asp:LinkButton ID="CancelButton" runat="server" CommandName="Cancel" >清除</asp:LinkButton>
<%-- <asp:Button ID="InsertButton" runat="server" CommandName="Insert" Text="插入" CssClass="ImgBtn"/>
<asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="清除" CssClass="ImgBtn"/>--%>
</td>
</tr>
</InsertItemTemplate>
<LayoutTemplate>
<table runat="server" width="80%">
<tr runat="server" style="border:1px solid #eee">
<td runat="server" style="border:1px solid #eee">
<table ID="itemPlaceholderContainer" runat="server" border="1" width="100%" style="background-color: #FFFFFF;border-collapse: collapse;border-color: #999999;border-style:none;border-width:1px;font-family: Verdana, Arial, Helvetica, sans-serif; border:1px solid #eee">
<tr runat="server" style="border:1px solid #eee">

<th runat="server" style="border:1px solid #eee">
类别ID</th>
<th runat="server" style="border:1px solid #eee">
类别名称</th>

<th id="Th1" runat="server" style="border:1px solid #eee">
操作
</th>
</tr>
<tr ID="itemPlaceholder" runat="server">
</tr>
</table>
</td>
</tr>

</table>
</LayoutTemplate>
<EditItemTemplate>
<tr style="border:1px solid #eee">

<td style="border:1px solid #eee;width:25%">
<asp:Label ID="PK_TYPE_IDLabel1" runat="server"
Text='<%# Eval("PK_TYPE_ID") %>' />
</td>
<td style="border:1px solid #eee;width:50%">
<asp:TextBox ID="NAMETextBox" runat="server" MaxLength="15" Text='<%# Bind("NAME") %>' style="word-wrap: break-word; word-break: break-all;" Width="90%"/>
</td>
<td style="border:1px solid #eee;width:25%">
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="Update">更新</asp:LinkButton>   
<asp:LinkButton ID="CancelButton" runat="server" CommandName="Cancel">取消</asp:LinkButton>
<%-- <asp:Button ID="UpdateButton" runat="server" CommandName="Update" Text="更新" CssClass="ImgBtn"/>
<asp:Button ID="CancelButton" runat="server" CommandName="Cancel" Text="取消" CssClass="ImgBtn"/>--%>
</td>
</tr>
</EditItemTemplate>

</asp:ListView>
msnadair 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 koukoujiayi 的回复:]
你可以新件一个页面测试!
以消除你对
GridView1.ShowFooter = true;

GridView1.ShowFooter = false;
的怀疑!!
注意,如果是代码绑定的话,不要忘了执行以上语句后,数据要绑定!!
[/Quote]

你的意思是说执行GridView1.ShowFooter = true后,要写数据绑定语句?
如:
(info是一个ILIST,放在VIEWSTATE里)

this.dg.datasource = this.info;
this.dg.databind();

但是为什么我单独测试,又不会呢! 哈。。。

这一步我先跳过! 继续试验下面的操作!
koukoujiayi 2010-03-30
  • 打赏
  • 举报
回复
你可以新件一个页面测试!
以消除你对
GridView1.ShowFooter = true;

GridView1.ShowFooter = false;
的怀疑!!
注意,如果是代码绑定的话,不要忘了执行以上语句后,数据要绑定!!

koukoujiayi 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 msnadair 的回复:]
使用FOOTROW试了一下,发现我的显示,隐藏FOOTROW按钮非得点击两次才有效!
显示的就是设置SHOWFOOTER = TRUE,隐藏的代码就是SHOWFOOTER=FALSE;
为啥非要点击两次! 谢谢!!!
[/Quote]
这应该不是问题!
肯定是你代码那儿有误!!
msnadair 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 jason_dct 的回复:]
load 的问题
[/Quote]
啥问题?

window.onload

还是page_load?


能说具体点吗
段传涛 2010-03-30
  • 打赏
  • 举报
回复
load 的问题
msnadair 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 koukoujiayi 的回复:]
引用 27 楼 msnadair 的回复:
但使用FootTemplate后,还能显示统计吗? 哈。。。
本来FootTemplate中是放有统计值的!

哦哦!!还加上统计!!这倒没做过!!
不过FootTemplate是模板列,一个模板列完全可加n个控件,
唯一需要设置处理的是什么情况下不显示,什么情况下显示
[/Quote]

使用FOOTROW试了一下,发现我的显示,隐藏FOOTROW按钮非得点击两次才有效!
显示的就是设置SHOWFOOTER = TRUE,隐藏的代码就是SHOWFOOTER=FALSE;
为啥非要点击两次! 谢谢!!!
cansum396 2010-03-30
  • 打赏
  • 举报
回复
obj.rows[i].cells[j]
你可以定义一个funtion
按列名返回"j"
function ReturnRowObj(ObjName, Row, Dg)//返回要选择列名的列号
{
//ObjName 列名
//Row 哪一行
//Dg 在哪个table上
var ObjCells = -1;
var LenC = Dg.rows[Row].cells.length;
for (var i = 0; i < LenC; i++) {
if (Dg.rows[Row].cells[i].firstChild.id == ObjName) {
ObjCells = i;
break;
}
}
return ObjCells;
}

用法:
var Grid=document.getElementById('Dg_PO');
Grid.rows[2].cells[ReturnRowObj("数量", 2, Grid)].firstChild.value
//返回'Dg_PO'的第2行'数量'所在的列的第一个控制值
porschev 2010-03-30
  • 打赏
  • 举报
回复
我觉得还是动态做表格吧。。。。
koukoujiayi 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 msnadair 的回复:]
但使用FootTemplate后,还能显示统计吗? 哈。。。
本来FootTemplate中是放有统计值的!
[/Quote]
哦哦!!还加上统计!!这倒没做过!!
不过FootTemplate是模板列,一个模板列完全可加n个控件,
唯一需要设置处理的是什么情况下不显示,什么情况下显示
ahhisoft 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 c11_11_11 的回复:]
这个其实相当的简单 只要把数据源上加一个空行,重新绑定即可
[/Quote]

同意你的观点。

另外,用Footer的话,如果要增加两个以上怎么办?
cansum396 2010-03-30
  • 打赏
  • 举报
回复
obj.rows[i].cells[j]
你可以定义一个funtion
按列名返回"j"
function ReturnRowObj(ObjName, Row, Dg)//返回要选择列名的列号
{
//ObjName 列名
//Row 哪一行
//Dg 在哪个table上
var ObjCells = -1;
var LenC = Dg.rows[Row].cells.length;
for (var i = 0; i < LenC; i++) {
if (Dg.rows[Row].cells[i].firstChild.id == ObjName) {
ObjCells = i;
break;
}
}
return ObjCells;
}
msnadair 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 koukoujiayi 的回复:]
引用 16 楼 msnadair 的回复:
对于使用FooterRow的方法,我也不了解FooterRow。 如果可以,请指点一二!

在GridView底部添加一行,用FooterRow来做是标准做法,(老外的书上)
好象也没特别好的方法!!
你可以在FooterRow中添加任何东西!就像模板列,事实上就是模板列!!
[/Quote]
一直在忙于其它事情,没来得及试验!
我决定先试试这个方法!
但使用FootTemplate后,还能显示统计吗? 哈。。。
本来FootTemplate中是放有统计值的!

谢谢!!! 试了之后,我再把结果告诉大家!
加载更多回复(25)

62,042

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧