[英]Removing dynamically created HTML table rows - Life Cycle / Viewstate problem
所以我有一個 HTML 表,其中包含動態添加的行和 ASP.NET 文本框。 如果 viewstate[dataonpage] = true,我會在 page_load 上重新實例化行和控件,並且我在添加行和控件的方法中將其聲明為 true。 (我需要他們堅持其他回發)
問題是我現在添加了一個CLEAR 按鈕,該按鈕在單擊時刪除所有 html 行(不包括標題),並且由於某種原因單擊按鈕時會出現索引錯誤,或者如果使用 Try/Catch它只刪除一半的行(每隔一行)。 我認為問題與 viewstate[dataonpage] 仍然是“true”有關,並且在頁面加載時重新添加數據。 如果我將 viewstate["dataonpage"] = "false" 添加到清除按鈕方法中,也會發生同樣的情況,但至少在第二次單擊時會以這種方式刪除行的后半部分。
我知道發生這種情況是因為按鈕事件處理程序直到 page_load 之后才會觸發,這就是它在第一次點擊時不起作用的原因。 但我不完全理解的是,為什么即使沒有這個,我的清除按鈕代碼也不會首先清除所有行。
任何有助於理解為什么它不起作用的幫助,以及解決方法將不勝感激!
protected void Page_Load(object sender, EventArgs e)
{
if (Convert.ToString(ViewState["DataOnPage"]) == "true")
{
Getmarketdata();
}
}
protected void Getdatabtn_Click(object sender, EventArgs e)
{
ViewState["DataOnPage"] = "true";
Getmarketdata();
}
下面是創建添加表行和控件的方法:
public void Getmarketdata()
{
String url = "https://api.rightmove.co.uk/api/rent/find?index=0&sortType=1&maxDaysSinceAdded=" + Dayssinceuploadtext.Text + "&locationIdentifier=OUTCODE%5e" + Outcodetext.Text + "&apiApplication=IPAD";
Response.Write(url);
using (var webclient = new WebClient())
{
String Rawjson = webclient.DownloadString(url);
ViewState["VSMarketDataJSONString"] = Rawjson;
dynamic dobj = JsonConvert.DeserializeObject<dynamic>(Rawjson);
int NoOfHouses = dobj["properties"].Count;
Response.Write("<br />" + NoOfHouses);
for (int i = 0; i < NoOfHouses; i++)
{
System.Web.UI.HtmlControls.HtmlTableRow tRow = new System.Web.UI.HtmlControls.HtmlTableRow();
GeneratorTable.Rows.Add(tRow);
String RMlink = String.Format("https://www.rightmove.co.uk/property-to-rent/property-" + dobj["properties"][i]["identifier"].ToString()) + ".html";
HyperLink hypLink = new HyperLink();
hypLink.Text = dobj["properties"][i]["identifier"].ToString();
hypLink.Target = "_blank";
hypLink.NavigateUrl = RMlink;
using (System.Web.UI.HtmlControls.HtmlTableCell tb1 = new System.Web.UI.HtmlControls.HtmlTableCell())
{
tRow.Cells.Add(tb1);
tb1.Controls.Add(hypLink);
}
using (System.Web.UI.HtmlControls.HtmlTableCell tb2 = new System.Web.UI.HtmlControls.HtmlTableCell())
{
TextBox tbEPCe = new TextBox();
tRow.Cells.Add(tb2);
tb2.Controls.Add(tbEPCe);
String txtboxID = (("EPCETxtBox") + i);
tbEPCe.ID = txtboxID;
tbEPCe.Style.Add("background", "none"); tbEPCe.Style.Add("border", "1px solid black"); tbEPCe.Style.Add("border-radius", "2px");
}
using (System.Web.UI.HtmlControls.HtmlTableCell tb3 = new System.Web.UI.HtmlControls.HtmlTableCell())
{
TextBox tbEPCp = new TextBox();
tRow.Cells.Add(tb3);
tb3.Controls.Add(tbEPCp);
String txtboxID = (("EPCPTxtBox") + i);
tbEPCp.ID = txtboxID;
tbEPCp.Style.Add("background", "none"); tbEPCp.Style.Add("border", "1px solid black"); tbEPCp.Style.Add("border-radius", "2px");
}
using (System.Web.UI.HtmlControls.HtmlTableCell tb4 = new System.Web.UI.HtmlControls.HtmlTableCell())
{
TextBox tbBbl = new TextBox();
tRow.Cells.Add(tb4);
tb4.Controls.Add(tbBbl);
String txtboxID = (("BblTxtBox") + i);
tbBbl.ID = txtboxID;
tbBbl.Style.Add("background", "none"); tbBbl.Style.Add("border", "1px solid black"); tbBbl.Style.Add("border-radius", "2px");
}
}
}
}
下面是清除表格行的方法:(這是一個不起作用的方法)
public void ClearTableRows()
{
System.Web.UI.HtmlControls.HtmlTable Htmlgeneratortable = ((System.Web.UI.HtmlControls.HtmlTable)GeneratorTable);
int NoOfRows = Htmlgeneratortable.Rows.Count;
for (int j = 1; j < NoOfRows; j++)
{
try
{
Htmlgeneratortable.Rows.RemoveAt(j);
}
catch
{ }
}
}
我將解釋發生了什么,因為您現在已經編寫了代碼; 我不相信我有能力提供答案,包括要進行的確切代碼更改,因此您當前的方法有什么問題:
您的表GeneratorTable
對所有客戶端都存在。 這並不意味着每次有人導航到你的網站產生的表格,就意味着有一個表,每一個客戶端登錄時獲得一個表。
因此,如果您為一個客戶端向其中添加行,然后將表發送到另一個客戶端,則兩個客戶端都會看到同一個表(添加了行)。
問題是清空表是與后端服務器無關的邏輯。 沒有理由為您的服務器被處理清空一個表,你的服務器應該只處理頁面導航和AJAX調用好看多了,它不應該被如何改變網頁的外觀,因為服務器只能每個客戶一次回應。
用GeneratorTable
響應客戶端然后在服務器上更新GeneratorTable
有什么意義? 客戶端永遠不會看到對表所做的更新,除非它們是從服務器重新發送的。
你說你是新手,需要學習 JS 和客戶端,這個練習應該作為一個例子,說明為什么你需要在前端放一些代碼,在后端放一些代碼,因為那里不是真正優雅的方式來做你想要做的只是服務器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.