C# ASP.NET GridView.DataBind未刷新GridView
首先,我使用多视图控件逐步引导用户进行搜索。“多视图”中的第一页只是一个带有按钮的搜索框,用于执行搜索 第二个页面有GridView,但我想保留搜索框和按钮,以便用户在没有找到他们要找的用户时再次搜索 当您从第一页搜索并移动到第二页时,GridView会显示正确的结果。但是当它在第二个页面上同时显示GridView和search时,GridView不会更新。下面是我正在使用的代码C# ASP.NET GridView.DataBind未刷新GridView,c#,asp.net,gridview,data-binding,C#,Asp.net,Gridview,Data Binding,首先,我使用多视图控件逐步引导用户进行搜索。“多视图”中的第一页只是一个带有按钮的搜索框,用于执行搜索 第二个页面有GridView,但我想保留搜索框和按钮,以便用户在没有找到他们要找的用户时再次搜索 当您从第一页搜索并移动到第二页时,GridView会显示正确的结果。但是当它在第二个页面上同时显示GridView和search时,GridView不会更新。下面是我正在使用的代码 //GridView = SearchResults //SqlDataSource = AddPlayerDa
//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;
}
}
与其声明一个新的gridview SearchResults,然后对gridview的卷影副本调用databind,不如在视图本身中对gridview进行数据绑定 就打电话 GridViewPlayerSearchView.FindControlSearchResults.DataBind 而不是 SearchResults.DataBind 那你就可以摆脱它了 GridView SearchResults=GridViewPlayerSearchView.FindControl搜索结果
这样,SqlDataSource控件将在数据绑定现有gridview而不是副本时执行select。是否需要设置DataSource属性?您在代码上方的注释中设置了这一点,但不清楚何时会发生。在SearchResults.DataBind上设置断点,并确保所有属性都在此处正确设置 顺便说一下。。。这类问题就是为什么使用适当的业务逻辑层是非常可取的。如果您控制的是实际执行DB查询的代码,那么您就不会有这个问题,或者确切地知道它在哪里
GridView SearchResults = (GridView)PlayerSearchView.FindControl("SearchResults");
SearchResults.DataSource = Data.Players.LoadAll(); //Loads a DataTable with your data
SearchResults.DataBind();
编辑:
如果删除“多视图”,是否所有操作都按预期方式进行?让我们缩小问题的范围。这是一种奇怪的行为,我建议您尝试一个存储过程。@nmiranda,使用存储过程还是直接SQL在这里没有区别。不是ASP.NET数据绑定发生了。@Eilon,对不起,用我的英语说,我的意思是这件事发生在我身上,在我用谷歌搜索后,我发现很多人都有同样的问题,他们用存储过程解决了,我也是。这就是我建议使用存储过程的原因。作为旁注。。。这段代码看起来像是一个SQL注入攻击正在等待发生。是的,确实如此,为了清晰起见,我以这种方式包含了SQL。我确实尝试过,但没有成功。使用C时,对象的赋值不是生成卷影副本。它引用的是原始控件对象。DataSource属性在.aspx主页中设置。正如我所说,当ViewState.ActivePageIndex从0更改为1时,它工作正常。但是当我已经在ActivePageIndex=1上时,GridView不会刷新。我不确定这样分配数据源是否有好处。好处是LoadAll实际上正在进行SQL/数据层调用。正是你缺少的部分。可以通过手动调用Select强制AddPlayerDataSource重新加载吗?我对这个东西不太熟悉,谢谢。我对这个问题研究得太久了。多视图对我隐瞒了真正的问题。我对搜索文本框有问题。更具体地说,我认为搜索文本框和按钮在多视图之外,但我把它们放在了多视图内。最终结果是两个不同的文本框。粗心的错误感谢大家的帮助。