我遇到了一个我似乎无法弄清楚的问题。以编程方式将asp:ListView设置为编辑模式,然后更新并保存
我正在处理的冲刺项目要求我在每个项目的项目模板中放置一个asp.net按钮。只有满足特定条件时才会显示此按钮。这工作正常,使用ItemDataBound委托来确定是否应该显示该按钮。另外,在项目模板中,有一个编辑按钮,已经有一段时间了。很多时候,用户点击编辑按钮,然后在编辑模板中点击一个名为“保存并关闭”的按钮。这将DB中的Complete标志设置为true。为了简化这个过程,用户希望在项目模板中能够点击保存而不是编辑,当编辑项目时立即执行与“保存并关闭”按钮相同的操作。
编辑模板中的保存和关闭按钮的命令名称为'Update',命令参数为'Close'。在ItemCommand委托方法中,我找到了绑定到我的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集合。
例如:
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已尝试转换从一个对象,它是空将抛出一个异常为int时返回null,效果显着。
所以也许我不在编辑模式,因为如果我是,那些FindControl的工作。
任何人有任何想法?