我遇到了一个我似乎无法弄清楚的问题。
我正在处理的sprint项目要求我在项目模板中为每个项目放置一个asp.net按钮。仅当满足特定条件时,才会显示此按钮。这工作正常,使用ItemDataBound委托来确定是否应该显示所述按钮。此外,在项目模板中,有一个编辑按钮,该按钮已经播放了一段时间。很多时候,用户单击编辑按钮,然后在编辑模板中单击一个名为“保存并关闭”的按钮。这会将DB中的Complete标志设置为true。为了简化此过程,用户希望在项目模板中能够单击保存而不是编辑,在编辑项目时立即执行与“保存并关闭”按钮相同的操作。
编辑模板中的保存并关闭按钮的命令名称为“更新”,命令参数为“关闭”。在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委托方法,通常在用户单击项目模板中的编辑按钮时使用该方法。此委托方法执行一些操作,例如在arguments参数中查找特定控件和更新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返回null,显然当尝试从null对象转换为int时会抛出异常。
所以也许我不处于编辑模式,因为如果我是,那些FindControl会起作用。
任何人都有任何想法?
答案 0 :(得分:1)
如果没有所有代码并且您的代码似乎正确,则很难调试,但这里有一些猜测。
检查列表视图的重新绑定是否在您到达该事件之前发生。 “更新”命令用于调用某些内置功能,可能使用该参数会以某种方式搞乱您的功能。查看命令名称here
的详细信息另一种方法是直接更新数据(不更改控件值),然后重新绑定列表以显示更改。
希望这些想法对你有用。