2011-12-07 29 views
1

私は、方法から引き出されたIEnumerable<MyDocument>DataSourceを持つListViewを持っています。カスタムデータソースを使用してListViewからアイテムを削除するにはどうすればよいですか?

文書が実際に削除されるため、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は基本的には次のとおりです。私は、ASPページのライフサイクルと、それに関連するいくつかの質問にまで読んできた

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で少し経験していないし、少し失われています。

リストページの項目を次のページの更新ではなくポストバックで消えるようにするにはどうすればよいですか?

答えて

6

あなたは以下のようにあなたのコーディングスタイルを変更することができ、あなたのListViewItemCommandでイベントにデータをリバウンドする必要があります:私はちょうどsimillar答えを投稿して

//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(); 
    } 
} 
+0

を:) – Mariusz

+0

いいえ、あなたの投稿コードが私に似ていません回答。 'ItemCommand'イベントでは' ListView'とデータベースからアイテムを削除しましたが、再度バインドしませんでした!しかし、私はデータベースからアイテムを削除し、データを 'ListView'にリバウンドさせるだけです。これはうまくいきます!もう一度レビューしてみてください。御時間ありがとうございます。 –

+2

私は同じ答えを投稿したいと思っていたが、あなたは私よりも速かった。 – Mariusz

関連する問題