c# - Gridview, Object reference not set to an instance of an object -


i can't find source problem. debugged code , ends fine , it's requested(deletion of page entry database), returns after code ends:

http://i.imgur.com/io5zy5v.png

the code listpages.aspx is:

<%@ page title="" language="c#" masterpagefile="~/admin/admin.master" autoeventwireup="true" codebehind="listpages.aspx.cs" inherits="topstart.admin.listpages" %>  <asp:content contentplaceholderid="main" runat="server">                 <div id="container" runat="server" class="full_w">                 <div class="h_title">manage pages</div>                 <h2>page management</h2>                 <p>this list of website pages. use icons on last column perform various operations on page.</p>              <div class="entry">                 <div class="sep"></div>             </div>             <asp:gridview id="pagelist" runat="server" allowpaging="true" onrowdatabound="pagelist_rowdatabound" onpageindexchanging="pagelist_pageindexchanging">                 <pagerstyle cssclass="pager" />             </asp:gridview>              <div class="entry">                 <div class="sep"></div>                      <a class="button add" href="addpage.aspx">add new page</a> <a class="button" href="">categories</a>              </div>         </div> 

the code listpages.apsx.cs:

using mysql.data.mysqlclient; using system; using system.collections.generic; using system.data; using system.linq; using system.web; using system.web.ui; using system.web.ui.htmlcontrols; using system.web.ui.webcontrols;  namespace topstart.admin {     public partial class listpages : system.web.ui.page     {         protected void page_load(object sender, eventargs e)         {                 createpagelist();         }      protected void createpagelist()     {         database db = new database("mysqlcon");          string query = "select p.id, p.title, p.slug, u.username, c.categories pages p left join users u on p.user_id = u.id left join categories c on p.category_id = c.id";          datatable dt = db.query(query);         dt.columns.add(new datacolumn("modify"));          pagelist.datasource = dt;         pagelist.databind();     }      protected void pagelist_rowdatabound(object sender, gridviewroweventargs e)     {         if (e.row.rowtype == datacontrolrowtype.header)         {             e.row.cells[5].width = new unit("65px");         }         else if (e.row.rowtype == datacontrolrowtype.datarow)         {             hyperlink edit = new hyperlink();             edit.navigateurl = "editpage.aspx?id=" + e.row.cells[0].text;             edit.cssclass = "table-icon edit";             edit.attributes.add("title", "edit");              hyperlink archive = new hyperlink();             archive.navigateurl = "archive.aspx?id=" + e.row.cells[0].text;             archive.cssclass = "table-icon archive";             archive.attributes.add("title", "archive");              linkbutton delete = new linkbutton();             delete.cssclass = "table-icon delete";             delete.attributes.add("title", "delete");             delete.attributes.add("id", e.row.cells[0].text);             delete.id = e.row.cells[0].text;             delete.click += new eventhandler(delete_click);              e.row.cells[5].controls.add(edit);             e.row.cells[5].controls.add(archive);             e.row.cells[5].controls.add(delete);         }     }      protected void pagelist_pageindexchanging(object sender, gridviewpageeventargs e)     {         pagelist.pageindex = e.newpageindex;         pagelist.databind();     }      protected void delete_click(object sender, eventargs e)     {         linkbutton lb = (linkbutton)sender;          database db = new database("mysqlcon");         string query = "delete pages id = @id";          mysqlparameter pid = new mysqlparameter("@id", mysqldbtype.int32, 4);         pid.value = lb.id;          if (db.mquery(query, pid))         {             container.innerhtml = "<div class=\"h_title\">success</div>\n<div class=\"n_ok\"><p>page deleted. redirecting...</p></div>";         }         else         {             container.innerhtml = "<div class=\"h_title\">failure</div>\n<div class=\"n_error\"><p>page couldn't deleted. redirecting...</p></div>";         }          response.addheader("refresh", "3;url=listpages.aspx");     } } 

}

i think there's wrong gridview. when delete button clicked code doesn't go straight event method goes pageload again, renders gridview again (supposedly, in code) , goes method event. please me i'm stuck this.

wrap createpagelist in if(!ispostback):

protected void page_load(object sender, eventargs e) {     if(!ispostback)         createpagelist(); } 

the complete lifecycle run through on every postback. normal. however, should not databind grid it's datasource page_load on every postback if viewstate enabled(default). if has changed, example after have deleted row delete-event.

otherwise changes lost since previous values loaded database, events aren't triggered anymore.

update creating controls dynamically in rowdatabound. not place, use rowcreated instead. dynamic controls must recreated on every postback. rowdatabound called if gridview databound not on every postback. opposed rowcreated is called on every postback.

but since setting navigateurl in rowdatabound derived id of underlying dataitem have create hyperlink in rowcreated mentioned appropriate id. use id in rowdatabound find hyperlink , set it's navigateurl property.

the important point recreated always, it's navigateurl property set once.


Comments