批量修改
背景:
我有一个网页,每个数据行上都有一个保存按钮。
每次调用AccessRecords函数的第一件事是dashboard.Controls.Clear();
,其中仪表板是我的PlaceHolder。
我有一个索引/计数器,用于唯一地标识每一行。
为第6行创建保存按钮时,它将收到名称saveButton6,并将recordId存储在CommandName属性中,并将提示存储在CommandArgument属性中。
保存然后触发保存命令/功能,并且使用两个存储的属性来构建SQL过程的查询。
当屏幕的初始加载获取所有记录时,就存在这种工作正常的幻觉。现在,我已将初始负载切换为仅活动记录,并且,如果您希望查看非活动记录,则必须选择它并单击“搜索”按钮-再次调用AccessRecords函数,但传递不同的参数。
问题: 当我搜索不活动的记录并选择要更改的字段,然后单击“保存”按钮时,例如在第6行上,它不在选定的当前记录(ID 15)上运行保存功能,而是在保存的记录上运行保存功能。保持6行(ID 11)位置的初始载荷。
这使我相信,当AccessRecords清除PlaceHolder然后重新建立控件时-即使它正确地更新了数据字段,它也不是重新构建saveButton6,而是重新使用以前的saveButton6(ID为11而不是15)。
编辑我已经对控件进行了更彻底的清除,发现除了默认查询结果之外,save函数没有执行任何其他操作。因此,如果我有6条活动记录,则可以单击相关的保存按钮更改其状态,并保存其状态。但是,当我进行过滤以获取非活动记录或所有记录时,一旦我点击保存,首先页面会重新加载-并使用默认的过滤器设置重新加载。记录还原为与原始6条活动记录相同的记录(保存下拉列表显示为属于搜索结果前6行的那些值作为选定值)。然后,如果我在此处单击“保存”,它将像在搜索之前在初始页面上一样处理“保存”按钮。这意味着,除非我修复此错误或拥有初始视图,否则所有记录处于非活动状态的记录都无法重新激活。
编辑-感知到的问题来源: 看来这可能与我看到其他人解决的事件处理程序问题有关。任何其他事件处理程序触发时,都会执行pageLoad函数。代码中的放置顺序似乎无关紧要。
可能的解决方案: 我想到的一种解决方案是使初始负载为空,这样就不会创建任何按钮。然后,当选择搜索按钮时,页面将重新加载-但要正常工作,我将必须将所有选定的过滤器选项存储在url或会话变量或某些其他半永久性存储中,以便在下一个使用加载。此“修复”将非常乏味。
问题-已编辑: 如何解决加载问题,使save事件在pageLoad事件之前触发?
代码布局
protected void accessRecord()
{
<logic that determines initial whereClause>
accessRecord(whereClause)
}
protected void accessRecord(string FilterParam)
{
<logic that populates dashboard PlaceHolder with query results>
//also creates buttons per record for record changes
}
protected void filter(object sender, EventArgs e)
{
filter(); //Allows button push in filter div to load dashboard
}
protected void filter()//allows filter to be called in other places to get the current filter settings and load the dashboard
{
<logic that determines whereClause with user selected filters from a filter div>
accessRecord(whereClause)
}
protected void Page_Load(object sender, EventArgs e)
{
loadFilterButtonBar();
accessRecord();
}
protected void saveChange(object sender,EventArgs e)
{
//executes SQL queries to save the change made to the record
<logic for queries>
filter();
//Uses LinkButton lb = (LinkButton)sender;
// string recordID = (string)lb.CommandName;
// string statusDD_ID = (string)lb.CommandArgument;
//To determine which record to update
}
答案 0 :(得分:0)
https://www.devu.com/tutorials/cs-asp/articles/lesson-17-page_load-and-page-ispostback
花了我一段时间才能弄清楚如何正确执行此操作。每次我尝试将ispostback作为加载条件时,如果我单击一个按钮,都会导致黑屏-我以前没有else子句。
...Page_Load...
if (!IsPostBack)
{
setInitialFilter();
}
else
{
HttpContext context = HttpContext.Current;
string whereClause = (string)(context.Session["whereClause"]);
accessRecord(whereClause);
}
...setInitialFilter()
{
<logic to set initial conditions>
}
protected void filter()//allows filter to be called in other places to get the current filter settings and load the dashboard
{
<logic that determines whereClause with user selected filters from a filter div>
//Added the following two lines
HttpContext context = HttpContext.Current;
context.Session["whereClause"] = whereClause;
accessRecord(whereClause)
}