删除动态创建的 HTML 表行 - 生命周期/视图状态问题



所以我有一个HTML表格,其中包含动态添加的行和 ASP.NET 文本框。如果 viewstate[dataonpage] = true,我会在page_load上重新实例化行和控件,并在添加行和控件的方法中将其声明为 true。(我需要它们在其他回发上坚持(

问题是我现在添加了一个 CLEAR 按钮,该按钮在单击时会删除所有 html行(不包括标题(,并且由于某种原因,单击按钮时会出现索引错误,或者如果使用 Try/Catch 它只删除一半的行(每隔一行(。我相信问题与视图状态[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和客户端,此练习应该作为一个例子,说明为什么您需要将某些代码放在前端,将一些代码放在后端,因为实际上没有一种简单的方法来完成您希望仅使用服务器执行的操作。

最新更新