我有一个带有HTML表的Web应用程序,其中包含输入框。我希望能够从C#方面向这些表添加行。为此,我使用一个调用此方法的asp按钮:
private void AddRow()
{
HtmlTableRow tRow = new HtmlTableRow();
HtmlTableCell cell = new HtmlTableCell();
HtmlTableCell cell2 = new HtmlTableCell();
HtmlTableCell cell3 = new HtmlTableCell();
HtmlTableCell cell4 = new HtmlTableCell();
cell.InnerHtml = "<input type=\"text\" size=\"29\">";
tRow.Cells.Add(cell);
cell2.InnerHtml = "<input type=\"text\" size=\"9\" class=\"units commas\" />";
cell2.Attributes.Add("class", "leftBorder textCenter");
tRow.Cells.Add(cell2);
cell3.InnerHtml = "<input type=\"text\" size=\"8\" class=\"value commas\" />";
cell3.Attributes.Add("class", "leftBorder textCenter");
tRow.Cells.Add(cell3);
cell4.InnerHtml = "<input type=\"text\" size=\"11\" readonly=\"readonly\" tabindex=\"-1\" class=\"totalA1 autoTotal\" /> ";
cell4.Attributes.Add("class", "leftBorder rightBorder textRight");
tRow.Cells.Add(cell4);
someTable.Rows.Add(tRow);
}
这非常有效......只需要一行。我可以点击按钮,它会添加一行。如果我再次点击它,它什么都不做。更具体地说,我怀疑它正在删除当前添加的行,将文档恢复到“默认”状态,然后添加一行(实际上什么都不做)。
假设我是对的,我需要能够以某种方式将行追加到另一个动态创建的行,而不是仅仅替换它。如果我不对,我只需要一种能够在按下按钮时不断添加行的方法。
我将如何做到这一点?
编辑:我应该指明,所有这些都可以在一个循环中完成,一下子完成。我希望只是为了测试而让它在按钮上工作,但它可以整齐地塞进某种循环中。我已经(有些)成功地把它放在一个。
答案 0 :(得分:3)
做你需要的绝对最好的方法是客户端,而不是服务器端。对于你正在做的事情,在每次插入一个新行(在我看来)中回发到服务器是没有意义的。您是否有必须执行此服务器端(C#)的特定原因?
使用Javascript(jQuery)在按钮单击时动态地将新行插入到表中。页面不会刷新,速度更快,并且可以提供更好的用户体验。
我假设您熟悉Javascript,但您可以将客户端事件绑定到服务器端按钮 - 只需添加onclientclick="insertRow();"
,其中onclientclick
是按钮控件的属性,{{1是您的页面中insertRow()
标记之间定义的Javascript方法。
如果您需要我写一个如何执行此操作的示例,请告诉我,我可以编辑我的答案。
答案 1 :(得分:1)
其他答案所表达的观点是完全正确的,因为这种架构存在很大的缺陷(它以2000年代中期的方式完成,一生以前在网络中完成)。话虽这么说,你有约束,你不能改变它们。以下是我要检查的两件事,其中一件已在评论中提出:
回发正在干扰表初始化。当访问者首次加载您的aspx页面时,浏览器将对您的页面执行HTTP GET请求。您的aspx页面类的IsPostback属性将为false。当用户单击您的按钮时,他们将向您的aspx页面发出POST请求,如果他们在浏览器上修改了它以及特定于.NET的属性集,则会为页面的当前状态传递一堆变量指示被按下的内容以及服务器应该执行的事件处理程序(在您的情况下,将调用调用AddRow的事件处理程序,但仅在首先执行Page_Load之后)。这就是他们建议将Page_Load逻辑包装在if(!IsPostback){}中的原因。
未对HtmlTable控件启用ViewState。 ViewState是特定于.NET的实现,它将服务器知道的所有HTML(输入框等)序列化为输出HTML中的隐藏字段。如果你想让.NET记住各种HTML标签的状态(它们包含什么,用户在每个标签中填写的内容等),那么他们需要在ViewState中有一个条目,它从postback传递到postback 。但是,请注意,只要有人刷新页面而没有按钮单击或使用浏览器上的后退和前进按钮(因为记住它们对应于HTTP GET请求,而不是HTTP POST请求),视频状态仍将重新初始化。解决这个问题的唯一方法就是填充会话。如果您对此感到满意,那么要启用视图状态,请在HtmlTable控件上使用.EnableViewState()方法,但请记住,这会增加Web应用程序的页面大小,因为.NET会将表中包含的内容序列化为字符串并将其放入隐藏的输入变量中。这将使编写所有服务器端逻辑变得“容易”,但如果表格变得非常大,则成本很高。
现在看来,阻力最小的方法就是让现有的基础设施运转起来,但相信我,你所承担的技术债务越来越多,无论是你还是其他人都必须付出代价。我强烈建议转到客户端添加行方法,这是围绕webforms中这种postback-viewstate-model疯狂的唯一方法。