Программно установите asp: ListView в режим редактирования, затем обновите и сохраните - PullRequest
0 голосов
/ 03 марта 2011

У меня проблема, которую я просто не могу понять.

Элемент спринта, над которым я работаю, требует, чтобы я поместил кнопку asp.net в шаблон элемента для каждого элемента. Эта кнопка отображается только при соблюдении определенных критериев. Это работает нормально, используя делегат ItemDataBound, чтобы определить, должна ли указанная кнопка отображаться. Кроме того, в шаблоне элемента есть кнопка редактирования, которая использовалась в течение некоторого времени. Часто пользователи нажимают кнопку редактирования, а затем в шаблоне редактирования нажимают кнопку «Сохранить и закрыть». Это устанавливает флаг Complete в БД на true. Чтобы упростить этот процесс, пользователи хотят, чтобы в шаблоне элемента была возможность нажать «Сохранить» вместо «Изменить», что сразу же делает то же самое, что и кнопка «Сохранить и закрыть» при редактировании элемента.

Кнопка сохранения и закрытия в шаблоне редактирования имеет имя команды «Обновить» и аргумент команды «Закрыть». В методе делегата ItemCommand я нахожу элемент управления checkbox, который привязан к свойству объекта linq, и устанавливаю checkbox.Checked в true.

В настоящее время я пытаюсь определить, какой будет наилучший подход. На данный момент у меня есть кнопка в моем шаблоне элемента с CommandName «Update» и CommandArgument «CloseReadOnly». Затем в моем методе делегата ItemCommand я делаю следующее:

protected void ActivityListView_ItemCommand(object sender, ListViewCommandEventArgs e)
{
    if (e.CommandName == "Update" && e.CommandArgument == "Close")
    {
        ListViewDataItem dataItem = (ListViewDataItem)e.Item;
        CheckBox completedCheckBox = (CheckBox)dataItem.FindControl("CompletedCheckBox");
        completedCheckBox.Checked = true;
    }

    // new code
    if (e.CommandName == "Update" && e.CommandArgument == "CloseReadOnly")
    {
        ActivityListView.EditIndex = ((ListViewDataItem)e.Item).DataItemIndex;
        // If I put this into play here, I get an exception. A NullReferenceException to be precise.
        //ListViewDataItem dataItem = (ListViewDataItem)e.Item;
        //CheckBox completedCheckBox = (CheckBox)dataItem.FindControl("CompletedCheckBox");
        //completedCheckBox.Checked = true;
    }
}

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

У меня также объявлен метод делегата ItemUpdating, который обычно используется, когда пользователь нажимает кнопку редактирования в шаблоне элемента. Этот метод делегата делает несколько вещей, таких как поиск определенного элемента управления и обновление коллекции NewValues ​​в параметре arguments.

например:

protected void ActivityListView_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
    DropDownList assignedTo = (DropDownList)ActivityListView.Items[e.ItemIndex].FindControl("somecontrol");
    e.NewValues["AssignedTo"] = Convert.ToInt32(assignedTo.SelectedValue);
}

Проблема в том, что FindControl возвращает значение null и, очевидно, при попытке преобразования в int из объекта, который имеет значение null, будет выдано исключение.

Так что, возможно, я не в режиме редактирования, потому что если бы я был, эти FindControl'ы сработали бы.

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 30 марта 2011

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

Убедитесь, что перепривязка списка не происходит до того, как вы дойдете до этого события.Команда «Обновить» используется для вызова некоторых встроенных функций, возможно, использование этого аргумента может как-то испортить вашу функциональность.Смотрите подробности об именах команд здесь

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

Надеюсь, что любая из этих идей сработает для вас.

...