获取前台gridview上的可编辑字段内容

zhengoodman 2020-11-27 09:34:03

问个问题,前台页面上用gridview创建了一个列表,现在后台想获取其中的可编辑字段,要如何处理?

<asp:TemplateField HeaderText="发货日期">
<ItemStyle Width="120px"></ItemStyle>
<ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="deliveryDate" text='<%#Bind("发货日期")%>' runat="server">
</asp:TextBox>
</EditItemTemplate>
</ItemTemplate>
</asp:TemplateField>

在每行记录最后都有个button,传递数据。但是可编辑文本内容无法获取。
<asp:TemplateField HeaderText="下发指示书">
<ItemStyle Width="60px"></ItemStyle>
<ItemTemplate>
<asp:Button ID="Button2" runat="server" onclick="Button2_Click" CommandArgument='<%# ((System.Data.DataRowView)Container.DataItem)["机号"]+","+((System.Data.DataRowView)Container.DataItem)["纳入国"]+","+((System.Data.DataRowView)Container.DataItem)["客户名称"]%>' Text="下发" />
</ItemTemplate>
</asp:TemplateField>

我在网上查询,看有的人使用onRowCommand来获取,但我仿照写的程序并不成功。g.Cells[6].Text的值一直为空字符串。
protected void gv_RowCommand(object sender, GridViewCommandEventArgs e)
{
string deliveryDate = "";
Control c = (Control)e.CommandSource;
GridViewRow g = (GridViewRow)c.NamingContainer;
deliveryDate = g.Cells[6].Text;

}
...全文
11514 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
当年我差一点就走到webform得胡同里,后来就被拉到》net mvc的团队,走到现在
  • 打赏
  • 举报
回复
哦, 上面的代码
this.FindControl(....)
可能应该是写作
sender.FindControl(.....)
才对,这要看你执行 Button2_Click 时的当前环境中调试 this 或者方法参数哪一个才是 Button2 这个对象而定。我对 asp.net 已经基本上遗忘了,毕竟有10几年基本上不考虑它了,只模糊记得这些基本原理基本知识。

现在还能看到 asp.net webform 的问题自然是感到惊奇,(仅从“术”的层面而言)编程毕竟是一个每隔2、3年就进化一代的行业,仅仅凭“爱好”不能学到编程的真谛,一定要时尚和实用才行。
  • 打赏
  • 举报
回复
我不知道你是为什么还在使用 webform。对于 webform、silverlight等等曾经在十几年前甚至20年前确实曾经很“伟大”的技术,我们的都深入使用过,起码是使用得到自定义开发大量用户控件的程度。但是 asp.net webform 基本上在 2005年退出 atlas 之后,就停止了。后来微软模仿 struts 搞 MVC,一直在简单模仿。知道 Razor 微软开始发力,现在的 WebAssembly 虽然晚了但是后来者居上,才算是刚刚“抄底”开始显露初步出霸主的地位。如果要学 asp.net,学习 web 应用开发,要站在真正的流行趋势上,而不是名义上时髦上。
  • 打赏
  • 举报
回复
我在 2008 年明确说明 asp.net webform 基本上已经被微软实质上搞死了,之后我基本上很少回答 asp.net 问题了,也慢慢遗忘了 asp.net 具体内容。

要处理用户录入的值,你可以在 Button2_Click 中直接使用类似这样的代码访问
var txt = (TextBox)this.FindControl("deliveryDate");
if(txt != null)
{
............... txt.TextBox ..............
}
这样的代码。

因为 FindControl 的机制就是自动找到当前控件的 NamingContainer,然后再从这个 NamingContainer 开始“向下层”去找所有的子控件,直到碰到内层的 NamingContainer 才停止查找。因此从一个 Button 控件出发调用 FindControl 就能找到同一行、其它模板中、并列地位的其它 webform 控件。

而且要注意用控件的 ID 访问。webform 为每一层 NamingContainer 中的控件都产生一个唯一的(比较长的)客户端 id 编号。因此要用 ID 来查找控件。当你使用 g.Cells[6].Text 这类代码,你并不确定这个 Cells[6]是什么的东西。例如你并不能确定它永远都是排在 6 下标,你也不能通过 .Text 属性来取到其内部的 webform 控件的什么值,另外用户万一在列的模板中(在 webform WYSIWYG编辑器)随便打一个空格则 webform 就可能把这个单元格的内容编译为(生成为)一个 LiteralControl 控件加上一个 TextBox 控件,因此你热认为的 Cells[6] 似乎包含的内容也是变动的。因此正确的编程方式是使用
deliveryDate.Text
来取控件的值。你会看到,简单直截了当,才是真的。

62,041

社区成员

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

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

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

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