保存按钮在“默认”结果集上工作,而在过滤的结果集上不起作用。

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (4)

批量编辑

的背景:

我有一个网页,每个数据行都有一个保存按钮。

每次调用AccessRecords函数时,它首先要做的是dashboard.Controls.Clear();仪表板是我的PlaceHolder。

我有一个索引/计数器,用于唯一地标识每一行。

为第6行创建保存按钮时,它接收名称saveButton6并将recordId存储在CommandName属性和CommandArgument属性中的计数器中。

然后save保存触发save命令/函数,两个存储的属性用于构建SQL过程的查询。

当屏幕的初始加载获取所有记录时,存在这种工作正常的错觉。我现在已将初始加载切换为仅活动记录,如果您希望查看非活动记录,则必须选择该选项并单击“搜索”按钮 - 再次调用AccessRecords函数但传入不同的参数。

问题: 当我搜索非活动记录并选择要更改的字段,然后单击第6行上的保存按钮时,它会运行保存功能而不是当前所选记录(ID 15),而是在记录保持6行(ID 11)位置的初始负载。

这让我相信,当AccessRecords清除PlaceHolder然后重新建立控件时 - 即使它正在更新数据字段,它也不会重建saveButton6,而是重用前一个saveButton6(ID为11而不是15)。

编辑我已经完成了更彻底的控件清理,并发现除了默认查询结果之外,不会执行任何保存功能。因此,如果我有6条活动记录,我可以更改其状态,点击相关的保存按钮并保存其状态。但是,当我过滤以获取非活动记录或所有记录时,一旦我点击保存,首先页面重新加载 - 并使用默认过滤器设置重新加载。记录将恢复为与原始6个活动记录相同的记录(除了下拉列表显示为选定值,这些值属于搜索结果中的前6行)。然后,如果我点击保存在这里,它会像在初始页面上那样处理保存按钮,然后再进行搜索。这意味着,除非我修复此错误或将初始视图设置为所有记录,否则永远不会重新激活非活动记录。

编辑 - 感知到的问题来源: 看起来这可能与我见过别人解决的事件处理程序问题有关。任何其他事件处理程序触发时,pageLoad函数执行的位置。代码中的放置顺序似乎无关紧要。

一个可能的解决方案: 我想到的一个解决方案是将初始加载设置为空白,因此不会创建任何按钮。然后,当选择搜索按钮时,页面会重新加载 - 但为了实现这一点,我必须将所有选定的过滤器选项存储在URL或会话变量或其他一些半持久性存储中,以便它们在下一个存储器中使用加载。这种“修复”将非常繁琐。

问题编辑: 如何解决加载问题,以便在pageLoad事件之前触发save事件?

代码布局

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
}
提问于
用户回答回答于

https://www.devu.com/tutorials/cs-asp/articles/lesson-17-page_load-and-page-ispostback

我花了一段时间才弄清楚如何正确地做到这一点。每次我尝试将ispostback作为加载条件时,如果我点击一个按钮,我将导致一个空白屏幕 - 我以前没有其他条款。

...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)
}

扫码关注云+社区

领取腾讯云代金券