【问题标题】:Gridview sorting doesn't fire in first clickGridview 排序不会在第一次单击时触发
【发布时间】:2013-05-27 22:28:00
【问题描述】:

我的代码中有以下两个控件

gridview(用于数据显示) sqldatasource(我的gridview的来源)

我想更改 gridview,但是当我更改我的 sqldatasource 中的 sqlcommandstring 时,在我的 datagrid 表排序的新视图中,第一次单击不会触发。 sqlcommandstring更改过程请参见下文。

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            if (IsPostBack)
            {   // Restore saved sqlcommand in page refresh, please see below
                SqlDataSource1.SelectCommand = ViewState["MySQL"].ToString();
            }
        }
        catch (Exception ex){}            
    }

    protected void btn_SearchLibrary_Click(object sender, EventArgs e)
    {
        SqlDataSource1.SelectCommand = "SELECT * FROM Books WHERE id=1 OR id=2";
        ViewState["MySQL"] = "SELECT * FROM Books WHERE id=1 OR id=2";
        //Saves sqlcommand in viewstate, to restore it in page refresh.
    }

【问题讨论】:

    标签: c# gridview asp.net-controls


    【解决方案1】:

    我相信 GridView 的 DataBinding 发生在按钮的 Click 事件处理程序之前。因此,在更改数据源本身之前,您的网格已经从数据源更新。在 Click 事件处理程序中更新 SelectCommand 后,您必须为网格显式调用 DataBind。
    另外,顺便说一句,看起来您在 Page_Load 中的 try-catch 只是为了抑制 NullReferenceException,因为 Page_Load 也会在 Click 事件处理程序之前触发,所以 ViewState["MySQL"] 一开始总是会为空。

    【讨论】:

    • 我试图理解但无法让你清楚,我在点击事件处理程序中添加了数据绑定,但它不起作用,
    • 我的回答可能有偏差,所以我想我需要澄清一下:你能帮我看看典型的用法吗?是否如下:第一次加载页面,网格为空;用户单击 SearchLibrary 按钮并填充网格;用户单击列标题对网格进行排序,但第一次单击未处理;所有后续点击都会正确处理和排序。准确吗?
    • 这个过程是这样的:第一次加载页面,网格里面有 3 个元素,(因为我的 SqlDataSource1 -> Sqlcommandstring = SELECT * from books),也排序工作正常,点击搜索后上面的 btn_SearchLibrary_Click 触发并且网格现在有 2 个元素,现在排序不太好。 (PS:我一直使用 View state 来保持命令字符串不变,因为如果我不使用它,gridview 会在每次单击某些东西时返回初始状态,并带有 3 个元素)
    • 创建一个小示例项目,我无法重现此问题。在您描述的相同情况下(为较小的集合添加过滤器),排序仍然有效。除非您想发布整个 aspx 和代码隐藏,否则不确定从这里去哪里。 (删除所有连接字符串或其他敏感信息。)
    • 我对 ViewState 的评论是,您不应该使用此类 Try-Catch 块来抑制异常 - 而应该找到异常的原因并修复它。在您的情况下,您有一个例外,因为您的第一次回发在写入之前调用ViewState["MySQL"],因此是 NullReferenceException。这是一个简单的修复 - 删除 try-catch 并改为使用:SqlDataSource1.SelectCommand = ViewState["MySQL"] as string; 希望这更有意义。
    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多