OlivesForDinner Ответов: 0

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 выпадающего списка. Спасибо, что попытался помочь. Я не знаю, почему то, что вы описали, не сработало, но я ценю вашу попытку.

0 Ответов