2011-12-07 2 views
1

저는 이고, IEnumerable<MyDocument>DataSource입니다.사용자 정의 데이터 소스를 사용하여 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를 경험하지 못하고 조금 잃어 버렸다.

ListView 항목이 다음 페이지 새로 고침 대신 포스트 백에서 사라지게하려면 어떻게해야합니까?

답변

6

당신은 당신의 ListViewItemCommand에서 이벤트 데이터를 회복해야합니다, 당신은 다음과 같이 코딩 스타일을 변경할 수 있습니다

//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

난 그냥 simillar 답 : – Mariusz

+0

을 게시 한 아니, 당신의 게시 된 코드가 모두없는 내 대답. 'ItemCommand' 이벤트에서 당신은'ListView'와 데이터베이스로부터 아이템을 삭제했지만 다시 바인딩되지 않았습니다! 하지만 데이터베이스에서 항목을 삭제하고 데이터를 'ListView'에 리바운드 한 경우에만 정상적으로 작동합니다. 검토하고 다시 시도해 주시겠습니까? 시간 내 줘서 고마워. –

+2

나는 같은 대답을 게시하고 싶었지만 당신은 나보다 더 빠르다는 것을 의미한다. – Mariusz

관련 문제