ASP.NET GridView.DataBind не опреснява GridView

Като начало използвам контрола MultiView, за да насочвам потребителите през търсенето. Първата страница в MultiView е просто поле за търсене с бутон за предварително извършване на търсенето.

Втората страница има GridView, но бих искал да запазя полето за търсене и бутона, за да може потребителят да търси отново, ако не намери потребителя, когото търси.

Когато търсите от първа страница и преминете към страница 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;
    }
}

person jWoose    schedule 13.02.2010    source източник
comment
Това е странно поведение, предлагам ви да опитате съхранена процедура.   -  person Nelson Miranda    schedule 13.02.2010
comment
@nmiranda, дали се използва съхранена процедура или директен SQL няма значение тук. Обвързването на данни на ASP.NET не се случва.   -  person Eilon    schedule 13.02.2010
comment
@Eilon, съжалявам за моя английски, това, което имах предвид, беше, че ми се е случило и след като потърсих в Google, намерих много хора със същия проблем и те го коригираха с помощта на съхранена процедура, както и аз. Ето защо предложих да използвам съхранена процедура.   -  person Nelson Miranda    schedule 13.02.2010
comment
Само като странична бележка... този код изглежда като атака с инжектиране на SQL, която чака да се случи.   -  person Bryan    schedule 14.02.2010
comment
Да, така е, включих SQL по този начин за яснота.   -  person jWoose    schedule 14.02.2010


Отговори (2)


Трябва ли да зададете свойството DataSource? Имате този набор в коментарите над кода, но не е ясно кога се случва това. Поставете точка на прекъсване на SearchResults.DataBind() и се уверете, че всички свойства са зададени правилно тук.

Между другото... тези видове проблеми са причината, поради която е безкрайно за предпочитане да се използва подходящ слой за бизнес логика. Ако контролирахте кода, който всъщност изпълнява заявката в DB, ​​или нямаше да имате този проблем, или знаете точно къде се намира.

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

РЕДАКТИРАНЕ: Всичко ли работи както очаквате, ако премахнете MultiView? Нека стесним проблема.

person Bryan    schedule 13.02.2010
comment
Свойството DataSource е зададено в главната страница .aspx. Както казах, когато ViewState.ActivePageIndex се промени от 0 на 1, той работи добре. Но когато вече съм на ActivePageIndex = 1, GridView не се опреснява. Не съм сигурен, че има полза от присвояването на DataSource по този начин. - person jWoose; 14.02.2010
comment
Ползата е, че LoadAll() всъщност прави извикването на SQL/слоя данни. Точно тази част, която ти липсва. Можете ли да принудите AddPlayerDataSource да презареди чрез ръчно извикване на Select()? Не съм много запознат с този обект. - person Bryan; 14.02.2010
comment
Благодаря ти. Бях гледал на проблема твърде дълго. MultiView криеше истинския проблем от мен. Имах проблеми с текстовото поле за търсене. - person jWoose; 14.02.2010
comment
За да бъда по-конкретен, мислех, че текстовото поле за търсене и бутонът са извън MultiView, но ги бях поставил вътре в MultiView. Крайният резултат беше 2 различни текстови полета. Небрежна грешка благодаря на всички за помощта. - person jWoose; 14.02.2010

Вместо да декларирате нов gridview „SearchResults“ и след това да извикате databind на това скрито копие на вашия gridview, просто свържете databind gridview-а в самия изглед.

Просто звънни

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

вместо

SearchResults.DataBind();

След това можете да се отървете от

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

По този начин вашата контрола SqlDataSource ще изпълни select() при свързване на данни на съществуващия gridview, а не на копието.

person Drell    schedule 13.02.2010
comment
Опитах това и не се получи. С C# присвояването на обекти не прави копие в сянка. Това се отнася до оригиналния контролен обект. - person jWoose; 13.02.2010