Удаление динамически создаваемых HTML строк таблицы - проблема жизненного цикла / состояния - PullRequest
0 голосов
/ 28 января 2020

, поэтому у меня есть таблица HTML с динамически добавляемыми строками и текстовыми полями ASP. NET. У меня есть строки и элементы управления, которые были повторно созданы на page_load, если viewstate [dataonpage] = true, и я объявляю это как true в методе, который добавляет строки и элементы управления. (Мне нужно, чтобы они сохранялись на других постбэках)

Проблема в в том, что я теперь добавил кнопку CLEAR, которая удаляет все строки html (исключая заголовки), когда по нему щелкают, и по какой-то причине при нажатии кнопки он получает ошибку индекса, или при использовании Try / Catch * удаляет только половину строк (каждая вторая строка). Я полагаю, что проблема как-то связана с тем, что viewstate [dataonpage] все еще "true", и данные повторно добавляются при загрузке страницы. Если я добавляю viewstate ["dataonpage"] = "false" в метод кнопки очистки, происходит то же самое, но, по крайней мере, при втором щелчке он удаляет вторую половину строк.

Я понимаю, что это происходит потому что обработчик события кнопки не срабатывает до окончания загрузки страницы, поэтому он не работает при первом нажатии. Но я не до конца понимаю, почему даже без этого мой код кнопки очистки не очищает все строки в первую очередь.

Любая помощь в понимании, почему это не работает, и работа вокруг будет принята с благодарностью!

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
                { }
            }
        }

1 Ответ

0 голосов
/ 28 января 2020

Я собираюсь объяснить, что происходит, так как у вас сейчас написан код; Я не верю в свою способность предоставить ответ, включая точные изменения кода, которые необходимо внести, поэтому вот что не так с вашим текущим подходом:

Ваша таблица, GeneratorTable существует для всех клиентов. Это не означает, что каждый раз, когда кто-то переходит на ваш сайт, создается таблица, это означает, что существует одна таблица, и каждый клиент, который входит в систему, получает эту одну таблицу.

Таким образом, если вы добавляете в него строки для одного клиента, а затем отправляете таблицу другому клиенту, оба клиента увидят одну и ту же таблицу (с добавленными строками).

Проблема заключается в том, что опустошение из таблицы есть logi c, который не имеет ничего общего с вашим внутренним сервером. У вашего сервера нет причин обрабатывать очистку таблицы, ваш сервер должен обрабатывать только переходы по страницам и AJAX вызовы в значительной степени, он не должен изменять внешний вид веб-страницы, поскольку сервер может отвечать только каждому клиенту один раз.

Какой смысл отвечать клиенту с помощью GeneratorTable и затем обновлять GeneratorTable на сервере? Клиент никогда не увидит обновления, внесенные в таблицу, если они не будут повторно отправлены с сервера.

Вы заявили, что вы новичок в этом и вам необходимо узнать о JS и на стороне клиента, это упражнение должно служить примером того, почему вам нужно поместить определенный код во внешний интерфейс и некоторый код во внутренний, поскольку на самом деле не существует элегантного способа сделать то, что вы хотите сделать, только с сервером.

...