简体   繁体   中英

Databind not refreshing Gridview

I have a gridview that I databind dynamically in my codebehind. For some reason, and only when a user deletes a row from the gridview (using a custom function), after postback, the gridview isn't refreshed (the deleted value remains). However, if the user were to refresh the gridview in any other way (ie. adding an item, selecting the right item in another tab, etc), it is bound just fine.

I put breakpoints in my codebehind to see what was happening, and apparently the gridview is being bound correctly, and the item that was deleted isn't in it's gridview.DataSource.

Here is my code, so if you see what I don't, just let me know!

Delete Row-Command:

if (e.CommandName == "delete")
        {
            int selectedId = int.Parse(e.CommandArgument.ToString());
            //delete selected row from database
            var item = (Item)DataContext.Items.Where(item => item.ItemId == selectedId).Single();
            if (item != null)
            {
                DataContext.CompanyGoalPrograms.DeleteObject(item);
            }
            DataContext.SaveChanges();

            bindGridView(currentId); //firing, but not refreshing gv after postback
            // currentId is a static variable
        }

bindGridView method (works every other time its called, so I don't think the problem is here):

protected void bindGridView(long thisId)
    {
        var query = from items in DataContext.Items
                    where items.SubSomething.Something.SomethingId == thisId && goals.SubSomething.YearId == selectedYearId //<--another static variable
                    select items;
        Gridview1.DataSource = from items in query.AsEnumerable()
                                    select new
                                    {
                                        items.Field1,
                                        items.Field2,
                                        items.Field3,
                                        Field4 = ((decimal)items.Field4).ToString("N2"),
                                        Field5 = ((decimal)items.Field5).ToString("N2"),
                                        Field6 = String.Format("{0:#,##0}", (long)items.Field6),
                                        Field7 = items.Field4 == null ? "$0.00" : ((decimal)items.Field7).ToString("C"),
                                    };
        Gridview1.DataBind();
     }

[EDIT] The funny thing is, not only does it run, but when I check the contents of the datasource after its been run (whilst debugging), the item that was deleted actually is removed from the datasource, it just doesn't show the changes to the user.

I figured out the problem:

Gridviews have predefined commands set up, such as 'select', 'edit', and 'delete'. When I try to define my own event to run with the command name 'delete', the program will try and run parts of my event alongside it's predefined event. This is what has been causing issues.

That was totally the problem with mine as well. I was passing "Delete" as the CommandName for the asp:ImageButton. After I saw your post I changed it to pass "DeleteThis" and it began working immediately. Reserved word problems like these....!

Thanks for posting the solution after the fact. It helped at least one person.

Victor Del Prete

Does the bindgridview get ran for sure? Have you run it in debug mode to verify?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM