【问题标题】:ASP.NET GridView.DataBind not refreshing the GridViewASP.NET GridView.DataBind 不刷新 GridView
【发布时间】:2011-01-16 09:45:15
【问题描述】:

首先,我使用 MultiView 控件引导用户完成搜索。 MultiView 中的第一页只是一个搜索框,带有一个用于执行搜索的按钮。

第二个页面有 GridView,但我想保留搜索框和按钮,以便用户在没有找到他们正在寻找的用户时再次搜索。

当您从第一页搜索并移至第二页时,GridView 会显示正确的结果。但是,当它在 GridView 和搜索的第二页上时,GridView 不会更新。下面是我正在使用的代码。

//GridView = SearchResults  
//SqlDataSource = AddPlayerDataSource  
//MultiView = PlayerSearchView

protected void PlayerSearch_Click(object sender, ImageClickEventArgs e)
{
    string userId = User.Identity.Name.ToString();

    if (SearchText.Text != "" && !userId.Equals(""))
    {
        GridView SearchResults = (GridView)PlayerSearchView.FindControl("SearchResults");

        string SqlSelect = "SELECT [id], [username] FROM [users] WHERE [username] LIKE '%" + SearchText.Text + "%'";
        AddPlayerDataSource.SelectCommand = SqlSelect;
        SearchResults.DataBind();

         if (PlayerSearchView.ActiveViewIndex != 1)
             PlayerSearchView.ActiveViewIndex = 1;
    }
}

【问题讨论】:

  • 这是一个奇怪的行为,我建议你尝试一个存储过程。
  • @nmiranda,这里是使用存储过程还是直接 SQL 没有区别。没有发生的是 ASP.NET 数据绑定。
  • @Eilon,对不起我的英语,我的意思是它发生在我身上,在我用谷歌搜索后,我发现很多人有同样的问题,他们使用存储过程修复了,我也是。这就是为什么我建议使用存储过程。
  • 顺便说一句……这段代码看起来像是等待发生的 SQL 注入攻击。
  • 是的,为了清楚起见,我以这种方式包含了 SQL。

标签: c# asp.net gridview data-binding


【解决方案1】:

是否需要设置 DataSource 属性?您在代码上方的 cmets 中设置了该设置,但尚不清楚何时发生。在 SearchResults.DataBind() 上设置断点,并确保此处所有属性设置正确。

顺便说一句...这些类型的问题就是为什么使用适当的业务逻辑层是无限可取的。如果您正在控制实际执行 DB 查询的代码,您将不会遇到这个问题或确切地知道它在哪里。

GridView SearchResults = (GridView)PlayerSearchView.FindControl("SearchResults");
SearchResults.DataSource = Data.Players.LoadAll(); //Loads a DataTable with your data
SearchResults.DataBind();

编辑: 如果删除 MultiView,一切是否都按您期望的方式工作?让我们缩小问题的范围。

【讨论】:

  • DataSource 属性在 .aspx 主页中设置。正如我所说,当 ViewState.ActivePageIndex 从 0 变为 1 时它工作正常。但是当我已经在 ActivePageIndex = 1 时,GridView 不会刷新。我不确定以这种方式分配 DataSource 是否有好处。
  • 好处是 LoadAll() 实际上是在进行 SQL/数据层调用。正是您缺少的部分。您可以通过手动调用 Select() 来强制 AddPlayerDataSource 重新加载吗?我对这个对象不太熟悉。
  • 谢谢。我已经研究这个问题太久了。 MultiView 对我隐藏了真正的问题。我遇到了搜索文本框的问题。
  • 更具体地说,我认为搜索文本框和按钮位于 MultiView 之外,但我已将它们放在 MultiView 中。最终结果是 2 个不同的文本框。粗心的错误感谢大家的帮助。
【解决方案2】:

不用声明一个新的gridview“SearchResults”,然后在你的gridview的影子副本上调用databind,只需在视图本身中对gridview进行数据绑定。

只要打电话

((GridView)PlayerSearchView.FindControl("SearchResults")).DataBind()

而不是

SearchResults.DataBind();

然后你就可以摆脱了

GridView SearchResults = (GridView)PlayerSearchView.FindControl("SearchResults");

这样,您的 SqlDataSource 控件将在对现有 gridview 进行数据绑定时执行 select(),而不是副本。

【讨论】:

  • 我确实尝试过,但没有成功。使用 C# 对象的分配不是制作“影子”副本。它指的是原来的控制对象。
猜你喜欢
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2023-04-01
  • 1970-01-01
相关资源
最近更新 更多