Gridview.editindex не обновляется, возможно, это связано с привязкой данных.
Ниже приведен отрывок из моего обработчика событий строки для элемента управления GridView. Игнорировать небезопасные для SQL, я параметризовать его, прежде чем он идет в прямом эфире.
if (e.CommandName == "cmdEdit") { // Convert the row index of the row being edited into an int. Int32 index = Convert.ToInt32(e.CommandArgument); // Set the gridview's EditIndex to the one being edited. gvStudents.EditIndex = index; Int32 id = Convert.ToInt32(gvStudents.DataKeys[index].Value); dsfname.SelectCommand = @"SELECT firstname FROM [a server] WHERE firstname IS NOT NULL AND idnum =" + id; dslname.SelectCommand = @"SELECT lastname FROM [a server] WHERE lastname IS NOT NULL AND idnum =" + id; dshours.SelectCommand = @"SELECT hours FROM [a server] WHERE hours IS NOT NULL AND idnum =" + id; dsemail.SelectCommand = @"SELECT email FROM [a server] WHERE email IS NOT NULL AND idnum =" + id; dsfname.DataBind(); dslname.DataBind(); dshours.DataBind(); dsemail.DataBind(); dsStudents.DataBind(); lblWarning.Text = ((GridViewRow)gvStudents.Rows[gvStudents.EditIndex]).RowState.ToString(); lblWarning.Visible = true; lblWarning.Text += " " + index; showGrid(); //((DropDownList)gvStudents.Rows[gvStudents.EditIndex].FindControl("ddlFirstName")).Items.Insert(0, new ListItem("", "")); }
Это происходит, когда пользователь нажимает на кнопку, чтобы начать редактирование. Как есть, я показываю метку для целей тестирования, lblWarning и заполняю ее состоянием строки выбранной строки и ее индексом. Состояние строки - "нормальное", что, по-видимому, означает, что Editindex GridView не был обновлен. Не знаю почему.
Закомментированный код внизу пытается добавить элемент в один из раскрывающихся списков. Он закомментирован, потому что вызывает исключение, которое говорит, что я ссылаюсь на объект, который не существует. То есть он не может найти выпадающий список.
Я новичок в ASP и не очень понимаю привязку данных, но, похоже, эта проблема связана с ним. Что мне нужно сделать, чтобы это изменение EditIndex вступило в силу?
Что я уже пробовал:
Попробовал использовать валидацию. Код во внутреннем блоке if никогда не срабатывает.
if (gvStudents.Rows[gvStudents.EditIndex].RowType == DataControlRowType.DataRow) { if ((gvStudents.Rows[gvStudents.EditIndex].RowState & DataControlRowState.Edit) > 0) { ((DropDownList)gvStudents.Rows[gvStudents.EditIndex].FindControl("ddlFirstName")).Items.Add("test item"); } }
Richard Deeming
Установка EditIndex
это не будет иметь никакого эффекта, пока вы снова не свяжете сетку. По-видимому, это то, что ваш showGrid
функция-это делать?
Попробуйте переместить код, который обновляет метку после вызова в showGrid
.
OlivesForDinner
Упс, я должен был объяснить showGrid(). В настоящее время все, что нужно сделать, это установить SelectCommand элемента управления источником данных GridView в то, что находится в поле поиска. Я уверен, что это неправильный способ сделать это, но это единственный очевидный способ, который я нашел, чтобы заполнить GridView.
Если я свяжу GridView сразу после установки EditIndex я получу:
Индекс был вне досягаемости. Должно быть неотрицательным и меньше размера коллекции.
Имя параметра: индекс
Это кажется странным, потому что, как было установлено ранее, индекс в этой точке равен 0, что должно быть нормально.
Richard Deeming
В таком случае вам, вероятно, понадобится позвонить в gvStudents.DataBind()
сразу же после того, как dsStudents.DataBind()
вызов.
OlivesForDinner
Получил ту же ошибку. Похоже, что-то фундаментально неправильно в том, как я сделал привязку.
Richard Deeming
Это странно. Какая строка создает исключение?
OlivesForDinner
Если я скорректирую приведенный выше код, чтобы иметь gvStudents.DataBind() сразу же после вызова dsStudents.DataBind(), the gvStudents.Строка DataBind() вызывает исключение.
OlivesForDinner
В конце концов я смог сделать то, что мне было нужно, используя событие OnDataBound выпадающего списка. Спасибо, что попытался помочь. Я не знаю, почему то, что вы описали, не сработало, но я ценю вашу попытку.