Проблема здесь в том, что 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