2010-02-13 2 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

Это странное поведение, я предлагаю вам попробовать хранимую процедуру. –

+2

@nmiranda. Не используется ли хранимая процедура или прямой SQL. Это привязка данных ASP.NET, которая не происходит. – Eilon

+0

@ Эйлон, извините, мой английский, я имел в виду, что это случилось со мной, и после того, как я погуглил, я нашел много людей с одинаковой проблемой, и они исправили использование хранимой процедуры, и я тоже. Поэтому я предложил используйте хранимую процедуру. –

ответ

3

Вам нужно установить свойство DataSource? У вас есть это в комментариях выше кода, но неясно, когда это происходит. Поместите точку останова на SearchResults.DataBind() и убедитесь, что все свойства установлены здесь правильно.

Кстати, эти проблемы возникают из-за того, что бесконечно предпочтительнее использовать надлежащий уровень бизнес-логики. Если вы контролируете код, который на самом деле выполняет запрос БД, у вас либо не будет этой проблемы, либо точно знать, где именно.

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

EDIT: ли все работает так, как вы ожидаете, что если вы удалите MultiView? Давайте сузим проблему.

+0

Свойство DataSource задано на главной странице .aspx. Как я уже сказал, когда ViewState.ActivePageIndex изменяется с 0 на 1, он отлично работает. Но когда я уже на ActivePageIndex = 1, GridView не обновляется. Я не уверен, что есть возможность назначить DataSource таким образом. – jWoose

+0

Преимущество в том, что LoadAll() фактически вызывает вызов уровня SQL/данных. Именно то, что вам не хватает.Можете ли вы принудительно перезагрузить AddPlayerDataSource, вручную выбрав Select()? Я не слишком хорошо знаком с этим объектом. – Bryan

+0

Спасибо. Я слишком долго искал проблему. MultiView скрывал от меня настоящую проблему. У меня возникли проблемы с текстовым полем поиска. – jWoose

0

Вместо того, чтобы объявить новый GridView «SearchResults» и затем вызвать DataBind на эту теневую копию вашего GridView, просто привязка к GridView в самом представлении.

Просто позвоните

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

вместо

SearchResults.DataBind();

Тогда вы можете избавиться от

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

Таким образом, ваш Sql Элемент управления DataSource будет выполнять select() при привязке данных к существующему gridview, а не к копии.

+0

Я попробовал это, и это не сработало. С C# назначение объектов не создает «теневую» копию. Это относится к исходному объекту управления. – jWoose