2010-02-13 109 views
4

要开始我正在使用MultiView控件来引导用户搜索。 MultiView中的第一页只是一个搜索框,其中包含一个用于执行搜索的按钮。ASP.NET GridView.DataBind不刷新GridView

第二页有GridView,但我想保留搜索框和按钮供用户再次搜索,如果他们没有找到他们正在寻找的用户。

当您从第1页进行搜索并移至第2页时,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; 
    } 
} 
+0

这是一个奇怪的行为,我建议你尝试一下存储过程。 – 2010-02-13 02:24:04

+2

@nmiranda,无论是使用存储过程还是直接使用SQL都没有什么不同。这是没有发生的ASP.NET数据绑定。 – Eilon 2010-02-13 02:43:28

+0

@Eilon,对不起我的英语,我的意思是它发生在我身上,在我Google搜索后,我发现许多人有同样的问题,他们固定使用存储过程,我也是这样。这就是为什么我建议使用存储过程。 – 2010-02-13 15:35:41

回答

3

您是否需要设置DataSource属性?你在代码上面的注释中已经有了,但是现在还不清楚这是什么时候发生的。在SearchResults.DataBind()上放置一个断点并确保在此处正确设置所有属性。

顺便说一句......这类问题是为什么使用合适的业务逻辑层无限可取的原因。如果您控制的是实际执行数据库查询的代码,则要么没有此问题,要么确切知道它在哪里。

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

编辑: 是否一切工作,你期望它,如果你删除了多视图的方式吗?我们来缩小这个问题。

+0

DataSource属性在.aspx主页面中设置。正如我所说的,当ViewState.ActivePageIndex从0变为1时,它可以正常工作。但是当我已经在ActivePageIndex = 1时,GridView不会刷新。我不确定这样分配DataSource有什么好处。 – jWoose 2010-02-14 02:33:34

+0

好处是LoadAll()实际上正在进行SQL /数据层调用。恰恰是你缺少的部分。你可以通过手动调用Select()来强制AddPlayerDataSource重新加载吗?我不太熟悉这个对象。 – Bryan 2010-02-14 03:57:17

+0

谢谢。我一直在考虑这个问题太久。 MultiView隐藏了我真正的问题。我在搜索文本框中遇到问题。 – jWoose 2010-02-14 14:43:43

0

而是宣布了新的GridView“SearchResult所”,然后调用数据绑定在你的GridView的影子副本的,只是在数据绑定视图本身的GridView控件。

只需拨打

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

,而不是

SearchResults.DataBind();

然后你就可以摆脱

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

这样,你的SQL当数据绑定现有的gridview时,DataSource控件将执行select(),而不是副本。

+0

我确实尝试过,并没有奏效。使用C#时,对象的分配不会产生“影子”副本。它指的是原始的控制对象。 – jWoose 2010-02-13 07:02:02