C# ASP.NET设置会话变量以控制已删除项目的显示是否第二次有效?

C# ASP.NET设置会话变量以控制已删除项目的显示是否第二次有效?,c#,asp.net,session,C#,Asp.net,Session,我有一个在页面加载时填充的网格。第一次显示数据库中不包括已删除项的用户数据时,数据库中有一个名为RecordIsDeletedYN的字段,如果设置为true,则表示记录已删除。因此,我的页面加载代码如下所示: if(Session["ShowDeletedItems"] != null) ShowDeletedItems = Convert.ToBoolean(Session["ShowDeletedItems"]); else ShowDeletedItems = false;

我有一个在页面加载时填充的网格。第一次显示数据库中不包括已删除项的用户数据时,数据库中有一个名为RecordIsDeletedYN的字段,如果设置为true,则表示记录已删除。因此,我的页面加载代码如下所示:

if(Session["ShowDeletedItems"] != null)
    ShowDeletedItems = Convert.ToBoolean(Session["ShowDeletedItems"]);
else
    ShowDeletedItems = false;

PopulateGrid();
我在表单顶部声明了一个页面变量:

private bool ShowDeletedItems = false;
我的想法是,第一次加载页面时,上面的代码将页面变量设置为false

然后页面加载调用我的PopulateGrid函数。在这里,我有一个基于ShowDeletedItems bool变量值构造的SQL查询

如果ShowDeletedItems为false,则SQL查询中将包含WHERE语句,该语句将添加:

strSQL += "WHERE (RecordIsDeletedYN = 0) ";
因此,启动时ShowDeletedItems为false,因此SQL WHERE包含在内,我们不会在网格中显示已删除的项!这管用

在我的屏幕上还有一个按钮,当按下该按钮时,它会查看页面变量的状态。如果它为false,它会将其翻转为true;如果它为false,它会将其翻转为false。代码如下:

protected void imgButtShowDeleted_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
    if(ShowDeletedItems)
        Session["ShowDeletedItems"] = "False";
    else
        Session["ShowDeletedItems"] = "True";

}
此设置有效,但仅在第二次按下按钮后,然后在每次后续按下时都能正常工作

我哪里做错了。我知道这一定和page事件的方式有关。我尝试将Page_Init中的会话变量初始化为false,但当我这样做时,它从不显示已删除的项目。会话变量始终设置为false


非常感谢您的帮助。

避免页面级变量引起混淆…在页面上设置一个get/set属性,直接获取或设置会话变量…这将简化您的代码并减少出现此类问题的可能性


也考虑如果它只是页面,不需要跨新页面请求的租用……考虑使用VIEWSTATE而不是Session。

< P>在页面中设置SeldDeleDebug项。根据,加载阶段发生在事件处理阶段之前。因此,Page.Load事件在任何控件更改事件之前引发

在您的情况下,在imgButtShowDeleted\u Click处理程序之前调用页面加载处理程序。因此,只有在单击按钮后进行额外回发后,才能看到更新的数据


要解决此问题,请在更改imgButtShowDeleted_Click事件处理程序中的ShowDeletedItems变量后重新绑定网格。

我明白你的意思,你能解释为什么ViewState更可取吗?我添加了Get Set和used ViewState,它的行为仍然相同?我还遇到了另一个问题,我有一个编辑按钮,它会将网格中选定的行带到另一个页面,允许您编辑选定用户的记录,单击会使表单重新加载并丢失选择?Vladimir,添加对imgButtShowDeleted中填充例程的调用\u单击例程已工作!!!但是,我有另一个按钮,允许您编辑所选项目,当我单击它时,它总是重新加载页面,然后我得到一个错误,说网格中没有选择任何内容。因此,出于某种原因,网格的状态似乎发生了变化,以至于当我按下按钮重新加载页面时,网格中选择的内容没有被选择?这个页面生命周期的东西非常混乱!我需要查看问题页面的代码才能找到原因。您能演示一下如何在服务器端管理网格吗?Vladimir,我使用的是DevExpress ASPxGridView。我使用一个名为PopulateGrid的例程填充它。我称之为Page_Init。这是代码:我试图添加代码,但它超出了注释中允许的字符限制!?除了使用这些评论,我想不出你是如何做到的。弗拉基米尔,没有办法编辑我原来的帖子,但是我现在已经解决了这个问题。我将Page_Init更改为Page_Load,现在选择被视为已选中,我将imagebutton更改为复选框,以便复选框的状态保持不变,现在编辑工作正常。感谢您的帮助,切换到在页面加载中填充屏幕是关键答案。