以编程方式将asp:ListView设置为编辑模式,然后更新并保存

时间:2011-03-03 19:13:55

标签: c# .net asp.net web-applications

我遇到了一个我似乎无法弄清楚的问题。

我正在处理的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会起作用。

任何人都有任何想法?

1 个答案:

答案 0 :(得分:1)

如果没有所有代码并且您的代码似乎正确,则很难调试,但这里有一些猜测。

检查列表视图的重新绑定是否在您到达该事件之前发生。 “更新”命令用于调用某些内置功能,可能使用该参数会以某种方式搞乱您的功能。查看命令名称here

的详细信息

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

希望这些想法对你有用。