У меня проблема, которую я просто не могу понять.
Элемент спринта, над которым я работаю, требует, чтобы я поместил кнопку 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'ы сработали бы.
У кого-нибудь есть идеи?