Maintain a DataTable between postbacks...

J

Jason

I have a DataTable from which I am trying to delete rows using the
DataGrid control. However, I'm having trouble maintaining the changes
to the DataTable between PostBacks. This is my first go 'round with
the DataGrid control, so pardon me if there are glaring mistakes...

public partial class control_panel_mail_Default : System.Web.UI.Page
{
private DataTable dt;

protected void Page_Load(object sender, EventArgs e)
{
dt = new DataTable();
LoadContacts();
}

private void LoadContacts()
{
if (!IsPostBack)
{
DataColumn dc;

dc = new DataColumn();
dc.ColumnName = "blog_contact_firstname";
dc.DataType = System.Type.GetType("System.String");
dt.Columns.Add(dc);

dc = new DataColumn();
dc.ColumnName = "blog_contact_lastname";
dc.DataType = System.Type.GetType("System.String");
dt.Columns.Add(dc);

dc = new DataColumn();
dc.ColumnName = "blog_contact_email";
dc.DataType = System.Type.GetType("System.String");
dt.Columns.Add(dc);

SqlConnection loConnection = new
SqlConnection(ConfigurationManager.AppSettings["Data_Connection_String"].ToString());
SqlDataAdapter loAdapter = new SqlDataAdapter("SELECT
blog_contact_firstname, blog_contact_lastname, blog_contact_email FROM
tbblog_contact WHERE blog_contact_deleted = 0 AND blog_contact_optout =
0 ORDER BY blog_contact_firstname", loConnection);
loAdapter.Fill(dt);

gvRecipientList.DataSource = dt;
gvRecipientList.DataBind();
}
else
{
dt = ViewState["ContactList"] as DataTable;
gvRecipientList.DataSource = dt;
gvRecipientList.DataBind();
}
}

protected void gvRecipientList_RowDeleting(Object sender,
GridViewDeleteEventArgs e)
{
DataRow dr = dt.Rows[e.RowIndex];
dt.Rows.Remove(dr);
ViewState.Add("ContactList", dt);
}
}

It fails on the statement:
DataRow dr = dt.Rows[e.RowIndex];
stating that the object reference not set to an instance of an
object... This happens even on the very first PostBack after the
initial load of the page.

Thanks in advance!
Jason
 
L

liming

I might be wrong...

The first time when you do a postback, there is no ViewState["ContactList"]
yet it seems. when it gets to the deleting part, i imagine there is nothing
for it to delete.

You should add ViewState.Add("ContactList", dt) into your
if(!Page.IsPostBack) block.
 
J

Jason

You are correct. When the page is initially loaded, (!IsPostBack) is a
true condition, so, it grabs the information from the database. That
is obvious because the GridView is populated with the correct data upon
initial load.

But, it is when you enter gvRecipientList_RowDeleting for the first
time, it's saying that "dt" is not set to an instance of an object.
That's what I'm not understanding at the moment...
 
L

liming

So did it work for you or ..?

1. First time enter in the page, gridview binded directly to the data from
db.
2. PostBack, Gridview binded to a null ViewState object, so did "dt".
3. Enter gvRecipientList_RowDeleting, you try to retrieve "dt".Rows... but
"dt" is null at this time.
 
J

Jason

I don't know if this is a proper solution, but I got this to work:

public partial class control_panel_mail_Default : System.Web.UI.Page
{
private DataTable dt;

protected void Page_Load(object sender, EventArgs e)
{
dt = new DataTable();
if (!IsPostBack)
{
LoadContacts();
}
else
{
dt = ViewState["ContactList"] as DataTable;
}
ViewState.Add("ContactList", dt);
gvRecipientList.DataSource = dt;
gvRecipientList.DataBind();
}

private void LoadContacts()
{
DataColumn dc;

dc = new DataColumn();
dc.ColumnName = "blog_contact_firstname";
dc.DataType = System.Type.GetType("System.String");
dt.Columns.Add(dc);

dc = new DataColumn();
dc.ColumnName = "blog_contact_lastname";
dc.DataType = System.Type.GetType("System.String");
dt.Columns.Add(dc);

dc = new DataColumn();
dc.ColumnName = "blog_contact_email";
dc.DataType = System.Type.GetType("System.String");
dt.Columns.Add(dc);

SqlConnection loConnection = new
SqlConnection(ConfigurationManager.AppSettings["Data_Connection_String"].ToString());
SqlDataAdapter loAdapter = new SqlDataAdapter("SELECT
blog_contact_firstname, blog_contact_lastname, blog_contact_email FROM
tbblog_contact WHERE blog_contact_deleted = 0 AND blog_contact_optout =
0 ORDER BY blog_contact_firstname", loConnection);
loAdapter.Fill(dt);

gvRecipientList.DataSource = dt;
gvRecipientList.DataBind();
}

protected void gvRecipientList_RowDeleting(Object sender,
GridViewDeleteEventArgs e)
{
dt = ViewState["ContactList"] as DataTable;
dt.Rows.Remove(dt.Rows[e.RowIndex]);
ViewState.Add("ContactList", dt);
gvRecipientList.DataSource = dt;
gvRecipientList.DataBind();
}
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,014
Latest member
BiancaFix3

Latest Threads

Top