Изменение SqlDataSource.SelectCommand во время выполнения прерывает разбиение на страницы - PullRequest
4 голосов
/ 23 июля 2010

У меня GridView привязан к SqlDataSource со значением по умолчанию SelectCommand, определенным так:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" DataSourceMode="DataSet"
      ConnectionString="<%$ ConnectionStrings:MyConn %>" 
      ProviderName="MySql.Data.MySqlClient" 
      SelectCommand="select * from blah blah" />

В некоторых случаях мне приходится динамически изменять этот запрос во время выполнения, поэтому я делаю следующее:

SqlDataSource1.SelectCommand = sql; // 'sql' is the new query
GridView1.PageIndex = 0;
GridView1.EditIndex = -1;
GridView1.SelectedIndex = -1;
GridView1.DataBind();
updatePanel.Update();

На самом деле это работает просто отлично, но когда я нажимаю на элементы управления нумерацией страниц, набор результатов по умолчанию возвращается к SelectCommand, определенному в SqlDataSource1.

Есть ли способ обойти это?

Спасибо, Mark

Ответы [ 2 ]

8 голосов
/ 28 февраля 2011

Проблема здесь в том, что SqlDataSource воссоздается, когда страница загружается после отправки, отправленной ссылками на пейджер. Там нет ничего, чтобы сказать ему, чтобы загрузить то, что вы установили динамически. Если бы вы использовали хранимую процедуру с параметрами, тогда ASP сохранял бы параметры в ViewState и повторно запускал выбор в SqlDataSource при загрузке страницы.

Итак, вам нужно сообщить SqlDataSource, что он имел для SQL, когда он последний раз загружался правильно.

Самый простой способ сделать это - сохранить SQL в ViewState, когда вы устанавливаете SelectCommand SqlDataSource, а затем снова получаете его в событии Page_Load и устанавливаете его обратно.

Например: допустим, у вас есть TextBox для некоторых критериев и кнопка поиска. Когда пользователь вводит некоторый текст в TextBox, а затем нажимает кнопку «Поиск», вы хотите, чтобы он создавал некоторый SQL-код (это, кстати, оставляет вам огромный риск для атак с использованием SQL-инъекций. критерии хорошо.), а затем установите свойство SelectCommand SqlDataSource. Именно в этот момент вы бы хотели сэкономить на SQL. Затем в событии Page_Load вы хотите получить его и установить для свойства SelectCommand это значение.

В Click of your button вы можете сохранить SQL:

Dim sSQL as String

sSQL = "SELECT somefields FROM sometable WHERE somefield = '" & Me.txtCriteria.Text & "'"
SqlDataSource1.SelectCommand = sSQL
ViewState("MySQL") = sSQL

Затем в событии Page_Load вы можете получить SQL и установить свойство SelectCommand:

Dim sSQL as String

If Me.IsPostBack() Then
    sSQL = ViewState("MySQL")
    SqlDataSource1.SelectCommand = sSQL
End If
0 голосов
/ 23 июля 2010

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

2) Попробуйте создать список перед загрузкой страницы. Я думаю, что размещение кода под page_init может помочь. Я не могу вспомнить точно на данный момент, но есть метод до page_load.

...