Sanxion
Sanxion

Reputation: 5

asp.net linq query datatable

I have been following this tutorial to implement edit/update functionality via a modal popup form in asp.net:

http://msdnaspdotnettuto.blogspot.com/2015/01/aspnet-gridview-crud-using-twitter.html

This is my code:

public partial class GroupSummary1 : System.Web.UI.Page
    {
        DataTable dt;
        protected void Page_Load(object sender, EventArgs e)
        {

            if (!IsPostBack)
            {
                LoadGroupSummary();

            }
        }

        private void LoadGroupSummary()
        {
            try
            { 
            UserBLL userBLL = new UserBLL();
            dt = userBLL.GetGroupSummary(2, 2017);
            gvGroupSummary.DataSource = dt;
            gvGroupSummary.DataBind();
            }
            catch (SqlException ex)
            {
                System.Console.Error.Write(ex.Message);
            }
        }

        protected void gvGroupSummary_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            int index = Convert.ToInt32(e.CommandArgument);
            if (e.CommandName.Equals("detail"))
            {
                string code = gvGroupSummary.DataKeys[index].Value.ToString();
                IEnumerable<DataRow> query = from i in dt.AsEnumerable()
                                             where i.Field<int>("GroupID").Equals(code)
                                             select i;
                DataTable detailTable = query.CopyToDataTable<DataRow>();
                DetailsView1.DataSource = detailTable;
                DetailsView1.DataBind();
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                sb.Append(@"<script type='text/javascript'>");
                sb.Append("$('#detailModal').modal('show');");
                sb.Append(@"</script>");
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "DetailModalScript", sb.ToString(), false);
            }
        }
    }

When I select the "detail" button on the grid view, the following error occurs:

System.ArgumentNullException HResult=0x80004003 Message=Value cannot be null. Parameter name: source Source= StackTrace:

At this line:

 IEnumerable<DataRow> query = from i in dt.AsEnumerable()
                                             where i.Field<int>("GroupID").Equals(code)
                                             select i;

The dt object is NULL and I suspect this is the source of the problem. However, I have declared it above just as in the tutorial.

Any ideas?

Thanks

Upvotes: 0

Views: 234

Answers (1)

Jacob
Jacob

Reputation: 728

LoadGroupSummary is only firing on initial page load, not on postback. Clicking your detail button to call gvGroupSummary_RowCommand() will cause a postback.

Simply remove the if (!IsPostBack) from your page load.

protected void Page_Load(object sender, EventArgs e)
{
    LoadGroupSummary();
}

EDIT:

Might be worth mentioning that if whatever data userBLL.GetGroupSummary() returns is static, you should probably only load it once. For Example:

private void LoadGroupSummary()
{
    try
    { 
        if (Session["GroupSummary"] != null)
        {
            dt = (DataTable)Session["GroupSummary"];
        }
        else
        {
            UserBLL userBLL = new UserBLL();
            dt = userBLL.GetGroupSummary(2, 2017);
            Session["GroupSummary"] = dt;                    
        }
        gvGroupSummary.DataSource = dt;
        gvGroupSummary.DataBind();
    }
    catch (SqlException ex)
    {
          System.Console.Error.Write(ex.Message);
    }
}

Upvotes: 1

Related Questions