Solved

ListView does not cause postback when calling ItemCommand

Posted on 2008-10-29
5
8,418 Views
Last Modified: 2013-11-08
I'm having a problem with rebinding data in a ListView right after OnItemCommand is triggered from a button in the ItemTemplate.  When the button is clicked, I am deleting the data in the row (which successfully occurs) but when I try to rebind the data in the ListView nothing happens until the page is refreshed.

I know that a suggested solution is to have an ObjectDataSource and to just declare what to do upon deletion in there but I need a solution for data binding data in the code-behind.  (Note that I have the delete function working and only need a solution for the page to postback and to repopulate the ListView right after.
<asp:ListView ID="lv_PagePosts" runat="server" ItemPlaceholderID="itemContainer" OnItemCommand="lv_PagePosts_ItemCommand">
            <LayoutTemplate>
                <asp:PlaceHolder ID="itemContainer" runat="server"></asp:PlaceHolder>
            </LayoutTemplate>
            <ItemTemplate>
                
            ......................
 
<asp:LinkButton ID="lb_delete" runat="server" Font-Bold="false" Visible="false" CommandName="Delete">Delete</asp:LinkButton>
                
            </ItemTemplate>
        </asp:ListView>
 
 
 
protected void lv_PagePosts_ItemCommand(object source, ListViewCommandEventArgs e)
    {
 
        if (e.CommandName == "Delete")
        {
            GamingNetworkDBDataContext db = new GamingNetworkDBDataContext();
            Label lbl_postID = (Label)e.Item.FindControl("lbl_postID");
            int postID = Convert.ToInt32(lbl_postID.Text);
 
            var p = from pp in db.PagePosts
                    where pp.postID == postID
                    select pp;
            
            db.PagePosts.DeleteAllOnSubmit(p);
            db.SubmitChanges();
 
            //rebind the data in ListView
            Build_Post_List();
        }
 
    }

Open in new window

0
Comment
Question by:tektician
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
5 Comments
 
LVL 10

Expert Comment

by:jinn_hnnl
ID: 22829073
Hi,

It looks fine to me though, the problem might come from Page life circle. You dont have to use object datasource if you want to have full control of your business objects, and bind your ListView upon you dynamical changes.

My suggestion is: Rebind your ListView after every event is done by doing it in PreRender. In simple explanation: Page_Load -> button event -> PreRender

So you dont have to rebind after you delete

Hope this helps

JINN

 

  protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        //rebind the data in ListView
        Build_Post_List(); 
     }

Open in new window

0
 

Author Comment

by:tektician
ID: 22829146
Hi JINN,

Thanks for the reply.

I tried overriding OnPreRender as you suggested by placing the the Build_Post_List() method in there but it didn't work.

What's strange is that when I placed a breakpoint in OnPreRender, it didn't even reach it when I clicked the linkbutton, yet the event for deleting the data was fired (and no postback occurred to update the ListView).
0
 
LVL 10

Expert Comment

by:jinn_hnnl
ID: 22829182
That's strange, because if the deleting event is fired then the postback has occurred (lv_PagePosts_ItemCommand).

First the Page_Load will be executed, then lv_PagePosts_ItemCommand, are you sure this event is fired ?

I have read your code a gain and I think putting this on PreRender is not ideal. Page load is a good place though, so what you did was right. (as you use PlaceHolder to add your contain dynamically)

Just make sure you rebind your List after every postback (outside of your !IsPostBack). Do you use UpdatePanel?

JINN
0
 

Accepted Solution

by:
tektician earned 0 total points
ID: 22829247
Got it!

Thanks for bringing up the UpdatePanel! I tried taking it out and finally my page gave me the following error;

           The ListView 'lv_PagePosts' raised event ItemDeleting which wasn't handled.

I placed an onItemDeleting method and it worked.  Typically this is used to handle an event that a cancellation of the delete method should happen.  Without this method defined, the 'Delete' command will not work.

I guess the fact that I had the ListView wrapped in an UpdatePanel kept the error from being shown in run-time.

Here is the code for future references:

<asp:ListView ID="lv_PagePosts" runat="server" ItemPlaceholderID="itemContainer" OnItemCommand="lv_PagePosts_ItemCommand" OnItemDeleting="lv_PagePosts_ItemDeleting">
            <LayoutTemplate>
                <asp:PlaceHolder ID="itemContainer" runat="server"></asp:PlaceHolder>
            </LayoutTemplate>
            <ItemTemplate>
 
...............................
            
<asp:LinkButton ID="lb_delete" runat="server" Font-Bold="false" Visible="false" CommandName="Delete">Delete</asp:LinkButton>
                
            </ItemTemplate>
        </asp:ListView>
 
 
protected void lv_PagePosts_ItemDeleting(object sender, ListViewDeleteEventArgs e)
    {
        // handle delete cancellation here
    }
 
    protected void lv_PagePosts_ItemCommand(object source, ListViewCommandEventArgs e)
    {
 
        if (e.CommandName == "Delete")
        {
            GamingNetworkDBDataContext db = new GamingNetworkDBDataContext();
            Label lbl_postID = (Label)e.Item.FindControl("lbl_postID");
            int postID = Convert.ToInt32(lbl_postID.Text);
 
            var p = from pp in db.PagePosts
                    where pp.postID == postID
                    select pp;
            
            db.PagePosts.DeleteAllOnSubmit(p);
            db.SubmitChanges();
 
            Build_Post_List();
        }
 
    }

Open in new window

0
 
LVL 10

Assisted Solution

by:jinn_hnnl
jinn_hnnl earned 500 total points
ID: 22829259
Yeah,

That what I was wondering too, when you have UpdatePanel, something will not showup when it's rendered back to the client as the partial page refresh, even the data has been changed or something has happened in the background.

I was kind of asking if you do use UP, make sure you have the right thing rendered and refresh accordingly

Glad that you worked it out

JINN
0

Featured Post

What is a Denial of Service (DoS)?

A DoS is a malicious attempt to prevent the normal operation of a computer system. You may frequently see the terms 'DDoS' (Distributed Denial of Service) and 'DoS' used interchangeably, but there are some subtle differences.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Just a quick little trick I learned recently.  Now that I'm using jQuery with abandon in my asp.net applications, I have grown tired of the following syntax:      (CODE) I suppose it just offends my sense of decency to put inline VBScript on a…
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
Monitoring a network: why having a policy is the best policy? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the enormous benefits of having a policy-based approach when monitoring medium and large networks. Software utilized in this v…
Monitoring a network: why having a policy is the best policy? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the enormous benefits of having a policy-based approach when monitoring medium and large networks. Software utilized in this v…

627 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question