c# - 如何使用自定义数据源从 ListView 中删除项目?

标签 c# asp.net

我有一个 ListViewIEnumerable<MyDocument> DataSource从方法中提取。

myDocsList_ItemCommand()中的代码肯定会运行,因为该文件实际上已被删除。我的问题是 ListView仍然显示(现已删除)文档,直到下一页刷新,即使我有代码要做 myDocsList.Items.Remove(dataItem) .

简化的 .ascx 基本上是:

<asp:ListView id="myDocsList" runat="server" 
        OnItemDataBound="myDocsList_ItemDataBound" 
        OnItemDeleting="myDocsList_ItemDeleting" 
        OnItemCommand="myDocsList_ItemCommand">
    <LayoutTemplate>
        <table>
            <asp:Placeholder id="itemPlaceholder" runat="server" />
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr><td>
                <asp:LinkButton 
                    ID="delete" runat="server"
                    CommandName="Delete" CommandArgument="X"
                    OnClientClick="javascript:return confirm('...');">
                        Delete
                </asp:LinkButton>
        </td></tr>
    </ItemTemplate>
</asp:ListView>

简化的 .ascx.cs 基本上是:

protected void Page_Load(object sender, EventArgs e)
{
}

protected void Page_PreRender(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        IEnumerable<MyDocument> docs = getDocuments();
        myDocsList.DataSource = docs;
        myDocsList.DataBind();
    }
}

/* so we have the ID of the document we're deleting later on */
protected void myDocsList_ItemDataBound(object sender, 
                                        ListViewItemEventArgs e)
{
    var deleteButton = 
        (LinkButton) ((Control) e.Item).FindControl("delete");
    deleteButton.CommandArgument =
        ((MyDocument) e.Item.DataItem).id.ToString();
}

/* or we get "raised event ItemDeleting which wasn't handled" */
protected void myDocsList_ItemDeleting(Object sender, 
                                        ListViewDeleteEventArgs e)
{
}

/* do something here? */
//protected void myDocsList_ItemDeleted(Object sender, 
//                                      ListViewDeletedEventArgs e)
//{
//}

protected void myDocsList_ItemCommand(object sender, 
                                        ListViewCommandEventArgs e)
{
    if (e.CommandName == "Delete")
    {
        int docId = int.Parse(e.CommandArgument.ToString());
        deleteDocument(docId);
        ListViewDataItem dataItem = (ListViewDataItem) e.Item;
        myDocsList.Items.Remove(dataItem);
    }
}

我一直在阅读 ASP 页面生命周期和一些相关问题,但我对 ASP 相当缺乏经验,有点迷茫。

如何让我的 ListView 项目在 PostBack 上消失而不是在下一个页面刷新时消失?

最佳答案

您必须在 ItemCommand 事件中将数据反弹到您的 ListView,您可以更改您的编码风格,如下所示:

//Create a new method for databind
void BindData()
{
    IEnumerable<MyDocument> docs = getDocuments();
    myDocsList.DataSource = docs;
    myDocsList.DataBind();
}

//Call databind method in your prerender event
protected void Page_PreRender(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindData();
    }
}

//Again bind data after delete operation
protected void myDocsList_ItemCommand(object sender,
       ListViewCommandEventArgs e)
{
    if (e.CommandName == "Delete")
    {
        int docId = int.Parse(e.CommandArgument.ToString());
        deleteDocument(docId);
        BindData();
    }
}

关于c# - 如何使用自定义数据源从 ListView 中删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8415135/

相关文章:

c# - 如何使用退出代码 : C# 退出程序

c# - 查找 MongoDB 文档并仅匹配带有 C# 驱动程序的数组元素

c# - 如何在 C# 中显示 SQL "PRINT"命令的输出?

.net - ASPNET 编译器 : error ASPRUNTIME: Target Directory not empty

asp.net - 任务计划程序 : Schedule multiple tasks to be run in a single scheduler

c# - 如何使用 Entity Framework 对 LocalDB 表进行 RESEED?

c# - 在 StartUri 不可用的子文件夹中实现的窗口

c# - 如何使用 LINQ group by with where 子句

javascript - 我怎样才能让我的标签点击另一个按钮

c# - 将字符串解析为对象