Изменение SqlDataSource.SelectCommand во время выполнения прерывает разбиение на страницы
У меня есть 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
,
Есть ли способ обойти это?
Спасибо Марк
2 ответа
Проблема здесь в том, что 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
1) Попробуйте установить источник данных из предварительного просмотра страницы, а не динамически. Это самое ясное решение, если вы не можете,
2) Попробуйте сгенерировать список до загрузки страницы. Я думаю, что размещение кода под page_init может помочь. Я не могу вспомнить точно на данный момент, но есть метод перед page_load.