簡體   English   中英

如何使用自定義數據源從ListView刪除項目?

[英]How do I delete an item from a ListView using a custom DataSource?

我有一個ListView和一個從方法拉出的IEnumerable<MyDocument> DataSource

myDocsList_ItemCommand()的代碼肯定可以運行,因為實際上已刪除了該文檔。 我的問題是,即使我有執行myDocsList.Items.Remove(dataItem)代碼, ListView仍會顯示(已刪除)的文檔,直到下一頁刷新為止。

簡化的.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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM