我已将一个空的asp.net表拖到我的webform上。我生成代码后面的所有行。
现在我的桌子已经填满并且有下拉列表。当用户点击保存时,我会遍历所有行并更新数据库中的下拉列表中的值。
这一切都很棒。但是,如果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()
}
最后一个没有做任何事,因为它没有更新任何东西。我不明白为什么。
那么我在这个生命周期中做错了什么在我的过程中出错了。当我希望立即更新表时,代码才能正常工作。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
如果您向页面动态添加控件,则需要先重建它们,然后才能对它们执行任何操作。
我通常采取的措施是完全绕过这些类型的问题,即使用转发器。然后,您可以在RepeaterItems上执行foreach循环。它很干净,而且相对简单。没有页面生命周期问题。
答案 2 :(得分:0)
尝试将动态控件的创建移至Page Init事件。