簡體   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