2011-03-03 53 views
0

我遇到了一个我似乎无法弄清楚的问题。以编程方式将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的工作。

任何人有任何想法?

回答

1

很难调试没有所有的代码和你的代码似乎是正确的,但这里有一些猜测。

检查在你到达该事件之前没有重新列出listview。 “更新”命令用于调用某些内置功能,也许使用该参数会让您的功能变得混乱。查看命令名称的详细信息here

另一种解决方法是直接更新数据(不更改控件值),然后重新绑定列表以显示更改。

希望任何这些想法都适合你。

相关问题