Ху, мальчик.
Вы не задавали это в своем вопросе, но вы написали какой-то вонючий код здесь. Я постараюсь ответить на ваш вопрос, но я также собираюсь решить некоторые другие проблемы здесь.
Не видя вашей разметки, мне сложно сказать, если вы создали GridViewResult
программно или она тоже есть в вашей разметке. Я не совсем уверен, что такое TaskGridViewResult
- это событие для GridViewResult
? У вас есть еще GridView
на вашей странице, и вы хотите показать GridViewResult
на основе некоторых критериев поиска?
Я также не уверен, почему вы положили весь свой код привязки GridView
в Page_Load
. Я вижу, что вы проверяете GetPostBackControl
, чтобы найти элемент управления, вызвавший PostBack
- это запах кода. Если вашим пользователям приходится нажимать определенную кнопку «Поиск», вы должны изолировать свой код привязки GridView
в событии Click
этой кнопки.
В любом случае, что касается TaskGridViewResult_RowUpdating
:
Похоже, вы пытаетесь обновить старые значения GridViewResult
до новых значений, установив его DataSource
и затем повторив его данные. Вы не можете сделать это. Что происходит, когда вы меняете событие RowUpdating
на:
protected void TaskGridViewResult_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
GridViewResult.DataSource = (DataTable)Session["Result"];
GridViewResult.DataBind();
}
Теперь, другие стороны:
Ваши операторы switch
являются запахами кода. DropDownList
s предоставляет свойство с именем SelectedValue
- если у вас есть какое-то значение по умолчанию, которое не является допустимым выбором (например, первая опция в DropDownList
), вы можете изменить свой исходный код с:
if ((test.ID == "SumbitSearch") && (DropDownListFrom.Text != "") && (DropDownListTo.Text != "") && (SearchField.Text != ""))
{
string from = string.Empty;
string to = string.Empty;
switch (DropDownListFrom.SelectedIndex)
{
case 0:
from = DropDownListFrom.Items[0].Value;
break;
/* other cases */
}
switch (DropDownListTo.SelectedIndex)
{
case 0:
to = DropDownListTo.Items[0].Value;
break;
/* other cases */
}
/* snip */
}
до:
if (test.ID == "SubmitSearch" && DropDownListFrom.SelectedIndex > 0 && DropDownListTo.SelectedIndex > 0 && SearchField.Text != "")
{
string from = DropDownListFrom.SelectedValue;
string to = DropDownListTo.SelectedValue;
/* snip */
}
Если можете, пожалуйста, оставьте свою разметку. Я могу предложить вам более конкретную помощь или совет, если я могу рассказать, что Controls
у вас есть на вашей странице и как они взаимодействуют.
Редактировать: Я должен также добавить, что вы должны привыкнуть использовать String.IsNullOrEmpty(string variable)
, а не сравнивать с ""
. Хотя это не такая большая проблема, когда вы ссылаетесь на текст из веб-элементов управления, использование привычки теперь предотвратит вас от серьезных головных болей и неэффективной проверки на пустые и пустые значения позже. Если вы находитесь в .NET 4.0, у вас должен быть доступ к IsNullOrWhiteSpace()
, что (на мой взгляд) более полезно в Интернете, где пользователи с большей вероятностью попытаются ввести нежелательные данные.
Редактировать 2: В ответ на ваши дополнительные данные выше:
В вашем RowUpdating
событии вам нужно извлечь новые значения из интерфейсных элементов управления, а затем повторно связать ваши данные. Похоже, ваш исходный код довольно близок к исходному коду MSDN здесь . Разница между вашим кодом и кодом в MSDN:
- Код MSDN берет новые данные из отредактированной строки и обновляет соответствующие данные в переменной Session
этими новыми данными.
- Код MSDN имеет функцию BindData()
. Однако я не уверен, что это ваша функция DataBind()
.
- Код MSDN обновляет GridView
путем повторной привязки GridView
к соответствующим данным в Session
.
Честно говоря, у меня есть некоторые проблемы с кодом MSDN. Я действительно, действительно ненавижу видеть код вроде: dt.Rows[row.DataItemIndex]["Id"] = ((TextBox)(row.Cells[1].Controls[0])).Text;
Для меня это мусор, потому что он так сильно связан с порядком ваших клеток.
Если бы я написал код, я бы явно создал все внешние элементы управления и использовал команду привязки (если вы не знакомы, в разметке это выглядит как <%# DataBinder.GetPropertyValue(Container.DataItem, "FieldName") %>
- см. Подробнее здесь ). Затем в моем RowUpdating
событии я использовал бы e.Row.FindControl("controlName")
и обновил бы Session
данные из этого.
Честно говоря, если ваши внутренние данные не меняются на регулярной основе, я не вижу причин для программного создания ваших GridView
s. Ваш код C # усложняет выполнение этих шагов самостоятельно, когда вы можете просто установить его один раз в своей разметке. Если вам нужно скрыть один GridView
, вы всегда можете установить для его свойства Visible
значение false
. Затем, когда вы будете готовы показать его, установите Visible = true
.
Наконец, я распространил свой код GridView
на очень много событий (нажатия кнопок, RowDataBound
события из других GridViews
/ Repeaters
и т. Д.), Я не могу себе представить, почему кто-то предложил Вы только положили это в Page_Load
.