繁体   English   中英

无法使用ASP / C#动态向一个表添加多行

[英]Cannot add more than one row to a table dynamically using ASP/C#

我有一个带有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\" />&nbsp;";
    cell4.Attributes.Add("class", "leftBorder rightBorder textRight");
    tRow.Cells.Add(cell4);

    someTable.Rows.Add(tRow);
}

这很漂亮...仅适用于一行。 我可以单击按钮,它会添加一行。 如果我再次单击它,它什么也没做。 更具体地说,我怀疑它正在删除当前添加的行,将文档还原为“默认”状态,然后添加一行(实际上不执行任何操作)。

假设我是对的,我需要以某种方式能够将一行添加到另一个动态创建的行,而不是仅仅替换它。 如果我做错了,我只需要一种方法就可以在按下按钮时连续添加行。

我将如何去做呢?

编辑:我应该指定,所有这些都可以在循环中一次完成。 我只是为了测试而希望它能够在按钮按下时起作用,但是可以将它们整齐地塞进某种循环中。 我已经成功完成了一些尝试。

做您所需的绝对最佳方法是客户端,而不是服务器端。 对于您正在执行的操作,每次插入新行时,回传到服务器都是没有意义的(我认为)。 您是否有特定原因必须执行此服务器端(C#)?

单击按钮后,使用Javascript(jQuery)将新行动态插入表中。 该页面不会刷新,速度更快,并且可以为用户带来更好的体验。

我假设您熟悉Javascript,但是您可以将客户端事件与服务器端按钮相关联-只需添加onclientclick="insertRow();" 其中onclientclick是按钮控件的属性, insertRow()是页面中<script></script>标记之间定义的Javascript方法。

如果您需要我写出执行此操作的示例,请让我知道,我可以编辑答案。

其他答案所表达的观点是完全正确的,因为该体系结构非常有缺陷(它的工作方式与2000年代中期(网络中的一生以前)一样)。 话虽这么说,但您有约束条件,无法更改。 这是我要检查的两件事,其中之一已经在注释中建议:

  1. 回发会干扰表初始化。 访客首次加载您的aspx页面时,浏览器将对您的页面执行HTTP GET请求。 aspx页面类的IsPostback属性为false。 当用户单击您的按钮时,他们将向您的aspx页面发出POST请求,并传递一堆用于页面当前状态的变量(如果他们在浏览器中进行了修改)以及.NET特定的属性集指示被按下的内容以及服务器应执行的事件处理程序(在您的情况下,将调用调用AddRow的事件处理程序,但仅在首先执行Page_Load之后)。 这就是为什么他们建议将您的Page_Load逻辑包装在if(!IsPostback){}中。

  2. HtmlTable控件未启用ViewState。 ViewState是特定于.NET的实现,用于将服务器所知的有关HTML的所有信息(输入框等)序列化为输出HTML中的隐藏字段。 如果您希望.NET记住各种HTML标记的状态(它们包含的内容,用户在每个HTML标记中填写的内容等),则它们需要在ViewState中具有一个条目,该条目从回发传递到回发。 但是请注意,只要有人刷新页面时没有单击按钮或使用浏览器上的后退和前进按钮(因为记住它们对应于HTTP GET请求,而不是HTTP POST请求),无论如何都会重新初始化viewstate。 解决此问题的唯一方法是将内容塞入Session。 如果可以,则要启用viewstate,请在HtmlTable控件上使用.EnableViewState()方法,尽管请记住,这将增加Web应用程序的页面大小,因为.NET会将表中包含的内容序列化为字符串并将其放在隐藏的输入变量中。 这将使编写所有服务器端逻辑变得“容易”,但是如果表很大,则会付出巨大的代价。

现在看来,阻力最小的途径就是使现有基础架构正常工作,但是相信我,您承担的技术债务越来越多,您或其他任何人都必须为此支付费用。 我强烈建议移至客户端添加行方法,这是解决Webforms中这种postback-viewstate-model疯狂的唯一方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM