Asp.Net GridView EditIndex состояние гонки? - PullRequest
4 голосов
/ 12 октября 2010

Это немного гипотетический вопрос, который отправил меня по тропинке в сад ... Скажем, у меня есть сетка, которую я хотел бы отредактировать ... учитывая метод, который связывает данные ..

private void BindGridFirst() {
        var data = new List<string>() {
            "A","B","C","D","E","F"
        };
        gridView.DataSource = data;
        gridView.DataBind();
    }

Теперь предположим, что я просматриваю эту страницу, и другой пользователь пришел и внес некоторые изменения в базовые данные, а теперь я иду и нажимаю кнопку редактирования, чтобы редактировать D ...

Метод редактирования довольно прост:

protected void RowEdit(object sender, GridViewEditEventArgs e) {
        gridView.EditIndex = e.NewEditIndex;
        BindGridSecond();
    }

Редактировать: Я вынужден отметить, что этот метод используется практически во всех онлайн-примерах, включая примеры от Microsoft.

Этот метод BindGridSecond () выглядит следующим образом:

private void BindGridSecond() {
        var data = new List<string>() {
            "A", "AA", "B","C","D","E","F"
        };
        gridView.DataSource = data;
        gridView.DataBind();
    }

Это точно так же, но данные теперь изменились. После обновления пользовательского интерфейса пользователь теперь находится в режиме редактирования для строки C .

Не то, что пользователь ожидал или хотел. Как следует обрабатывать этот сценарий, чтобы избежать такой проблемы?

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Лично я использую свойство DataKeyNames и SelectedDataKey в GridView, чтобы я мог легко получить первичный ключ строки, которую хочет пользователь, вместо того, чтобы полагаться на индекс сетки.

Byиспользуя первичный ключ, у вас не будет проблем с добавлением новых элементов в коллекцию, например, в вашем примере.Кроме того, использование первичного ключа облегчает работу с пейджингом в сетке, поскольку вам не нужно учитывать номер страницы и индекс.

0 голосов
/ 12 октября 2010

Имхо есть два варианта:

Например, вы можете кэшировать данные, которые вы хотите привязать к сетке в сеансе. Таким образом, вы можете проверить изменения перед вызовом BindGridSecond-Method и предупредить пользователя, если были внесены какие-либо изменения, когда он просматривал страницу.

В варианте 2 вы снова кэшируете данные, которые вы связывали в BindGridFirst-Method, и просто работаете с этими данными для следующих действий PostBack. Поэтому вам не нужно беспокоиться об изменениях, которые могут возникнуть при просмотре таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...