DetailsView не обновляется и не изменяется только после 2 щелчков мыши, Отмена отображения редактируемых значений только для чтения

#c# #asp.net #.net #data-binding #detailsview

#c# #asp.net #.net #привязка к данным #detailsview

Вопрос:

Я создал detailsview, который появляется после выбора даты в календаре. Это detailsview заполняется с помощью инструкции select в коде ниже. Вот список моих проблем, с которыми я сталкиваюсь:

  1. Я должен дважды нажать на кнопку редактирования, чтобы перевести detailsview в режим редактирования.
  2. После перехода в режим редактирования я вижу кнопку обновления и отмены, но мне также приходится дважды нажимать на отмену, чтобы вернуться в состояние только для чтения.
  3. Когда я нахожусь в режиме редактирования, у меня есть 3 строки, которые можно редактировать, когда я дважды нажимаю «Отмена» в режиме только для чтения, значения этих 3 строк больше не отображаются, это просто пустые поля, хотя данные все еще находятся в базе данных.
  4. Когда я что-то меняю в режиме редактирования и нажимаю Обновить, мой detailsview просто исчезает.

Ошибка в коде:

 protected void DetailView1_ModeChanging(Object sender, DetailsViewModeEventArgs e)
{
    if (e.NewMode == DetailsViewMode.Edit)
    {
        DetailsView1.ChangeMode(e.NewMode);
    }
    if (e.CancelingEdit)
    {
        DetailsView1.ChangeMode(DetailsViewMode.ReadOnly);   
    }
}

protected void DetailView1_ItemUpdating(Object sender, DetailsViewUpdateEventArgs e)
{
    DetailsView1.DataBind();
}

protected void DetailsView1_ItemUpdated(object sender, DetailsViewUpdatedEventArgs e)
{
    DetailsView1.DataBind();
}
  

Разметка:

 <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" 
    OnModeChanging="DetailView1_ModeChanging" OnItemUpdating="DetailView1_ItemUpdating"
    OnItemUpdated="DetailsView1_ItemUpdated"
    AllowPaging="True" PageSize="5" HeaderText="Agenda"  CellPadding="10" 
    ForeColor="#333333" />
  

Ответ №1:

Ваша проблема в DetailView1_ModeChanging

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

Из MSDN

вам нужно использовать Item Command event

 protected void DetailsView1_ItemCommand(object sender, DetailsViewCommandEventArgs e)
{
    if (e.CommandName == "Edit")
    {
        DetailsView1.ChangeMode(DetailsViewMode.Edit);
    }
}
  

Редактировать:

  protected void DetailView1_ModeChanging(Object sender, DetailsViewModeEventArgs e)
    {
        if (e.NewMode == DetailsViewMode.Edit)
        {
            DetailsView1.ChangeMode(e.NewMode);
            DetailsView1.Datebind(); // add this and check
        }
        if (e.CancelingEdit)
        {
            DetailsView1.ChangeMode(DetailsViewMode.ReadOnly);   
            DetailsView1.Datebind(); // add this and check
        }
    }
  

Комментарии:

1. Здравствуйте, спасибо за ваш ответ. Я добавил OnItemCommand="DetailsView1_ItemCommand в свой detailsview и использовал код, который вы написали выше. Сначала я поместил весь свой код в текст, затем я получил сообщение, что это запускало событие ModeChanging, которое не было обработано, поэтому я вернул этот метод в качестве кода для использования. Проблема остается, мне все еще приходится дважды щелкнуть, прежде чем перейти в режим редактирования, и редактирование не работает.

2. Я пробовал это, и когда я запускаю программу, мой detailsview исчезает с экрана, когда я нажимаю кнопку Редактирования. Та же проблема возникает, когда я использую gridview вместо detailsview.