1

我已将一个空的 asp.net 表拖到我的网络表单上。我在这些后面的代码中生成所有行。

现在我的桌子被填满并且有下拉列表。当用户点击保存时,我会浏览所有行并更新数据库中下拉列表中的值。

这一切都很好。但是,如果 2 列各有“Present”,那么这 2 列不应再显示,并且 2 个新列与其他下拉列表一起放置在其位置。

这一切都有效。但是,您必须将整个页面刷新到应该消失的 2 列才能消失。

所以我试图做的是在按钮点击事件结束时。清除整个表,然后重新生成它。但是,当我这样做时,无论出于何种原因,我的值都不再保存到数据库中。

if (IsPostBack == false)
{
    // check if dummy variables exist in db- If true just generate tables with values in db. If not generate them. 

}
else
{
   // grab the values from the database
   // generate tables with the values
}

btn click event
{
   go through all rows in table(foreach loop)
   update each column in the database with cells in each row. while in foreach loop.
   //done
}

所以这就是它的运行方式,它的工作原理是预期(所有正确的值都被保存),表只是没有更新给用户。

不工作

    if (IsPostBack == false)
    {
        // same code as above
    }

   // if postback is true do nothing. By the time it gets to the click event it says there is zero rows in the table so nothing happens.
    btn click event
    {
       // same code
    }

也失败。

if (IsPostBack == false)
{
   // same code as above
}
else
{
   // same code as above but moved into its own method.
   gernerateTable();
}

btn click event
{
   // update all rows
   // once done clear the Tables rows
   // call generateTable()
}

最后一个什么都不做,因为出于某种原因它不更新任何东西。我不明白为什么。

那么我在这个生命周期中做错了什么我的过程中的某些东西是错误的。当我希望立即更新表格时,该代码不起作用。

4

3 回答 3

1

在构建页面时,ASP.NET 在创建控件时生成控件 ID。这些 ID 被呈现为 HTML 并由浏览器提交回服务器。在回发期间,ASP.NET 重新生成页面上的控件以确定 ID,然后将数据值分配给请求数据中的控件。

因此,如果您动态生成控件(带有下拉列表的表格行),那么您需要在检查、保存或修改它们之前生成所有这些行。我过去使用的一个常见模式是这样的:

OnPageLoad() {
  get data;
  build controls;
  bind data; 
}

OnButtonClick() {
  save data();
  build controls; // if changed by 'remove' or 'add'
  bind data;
}
于 2010-03-22T22:46:46.457 回答
0

如果您将控件动态添加到页面,则需要先重建它们,然后才能对它们进行任何操作。

为了完全绕过这些类型的问题,我通常会使用中继器。然后,您仍然可以在 RepeaterItems 上执行您的 foreach 循环。它很干净,也相对简单。没有页面生命周期问题。

于 2010-03-22T22:03:41.567 回答
0

尝试将动态控件的创建移至 Page Init 事件。

于 2010-03-22T22:13:19.890 回答