Question

I have 2 aspx pages. CreateEstimate1.aspx and CreateEstimate2.aspx. If i navigate directly to CreateEstimate2.aspx everything works correctly no problems at all. But if i am on CreateEstimate1.aspx and then have a server.transfer("CreateEstimate2.aspx") i get the weirdest error.

I have a radgrid that gets built in Page_init and works fine if i go directly to that page. But as soon as i get transfered to CreateEstimate2.aspx from CreateEstimate1.aspx using server.transfer or response.redirect i get the following error:

"Unable to cast object of type 'System.Int32' to type 'System.Data.DataTable'."

CreateEstimate2.aspx

public partial class Admin_CreateEstimate2 : System.Web.UI.Page
{
    invoicer inv = new invoicer();


    protected void Page_Init(object sender, EventArgs e)
    {

        string ctrlname = this.Page.Request.Params.Get("__EVENTTARGET");

        if (Session["Tables"] == null)
        {
            Session.Add("Tables", 1);
            DataTable dt = inv.GetTable();

            Session.Add(Session["Tables"].ToString(), dt);
            inv.DefineGridStructure(1, PlaceHolder2, true);
        }
        if (IsPostBack)
        {
            ctrlname = ctrlname.Split('$').Last();

            int next = Convert.ToInt32(inv.GetSession());
            PlaceHolder2.Controls.Clear();
            inv.loopGrids(PlaceHolder2);

            if (ctrlname == "Button1")
            {
                next = next + 1;
                Session.Add("Tables", next);
                Response.Write("Button getSession: " + inv.GetSession());
                DataTable dt = inv.GetTable();
                Session.Add(Session["Tables"].ToString(), dt);
                inv.DefineGridStructure(next, PlaceHolder2, true);
            }

        }
    }



    protected void Button1_Click(object sender, EventArgs e)
    {

    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        inv.PreviewAll(PlaceHolder2);
    }
}

invoicer.cs

public class invoicer
{
    public class MyTemplate : ITemplate
    {
        private string colname;
        protected Label lControl;

        public MyTemplate(string cName)
        {
            colname = cName;
        }
        public void InstantiateIn(System.Web.UI.Control container)
        {
            lControl = new Label();
            lControl.ID = "Label-DurationType";
            lControl.DataBinding += new EventHandler(lControl_DataBinding);
            container.Controls.Add(lControl);
        }

        public void lControl_DataBinding(object sender, EventArgs e)
        {
            Label l = (Label)sender;
            GridDataItem container = (GridDataItem)l.NamingContainer;
            l.Text = ((DataRowView)container.DataItem)[colname].ToString() + "<br />";
        }
    }


    public class MyEditTemplate : IBindableTemplate
    {
        public void InstantiateIn(Control container)
        {
            GridEditableItem item = ((GridEditableItem)(container.NamingContainer));
            DropDownList drop = new DropDownList();
            drop.ID = "DurationType-DDL";
            drop.DataSource = (DataTable)GetTableForDropDown();
            drop.DataTextField = "DurationType";
            drop.DataValueField = "DurationType";
            container.Controls.Add(drop);
        }

        public System.Collections.Specialized.IOrderedDictionary ExtractValues(System.Web.UI.Control container)
        {
            OrderedDictionary od = new OrderedDictionary();
            od.Add("DurationType", ((DropDownList)(((GridDataItem)(container)).FindControl("DurationType-DDL"))).DataValueField);
            return od;
        }
    }

    void grid_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
    {
        RadGrid grid = (RadGrid)sender;
        string id = grid.ID;
        DataTable current = (DataTable)HttpContext.Current.Session[int.Parse(id.Split(new string[] { "RadGrid" }, StringSplitOptions.RemoveEmptyEntries)[0])];
        grid.DataSource = current;
    }



    protected void grid_ItemDataBound(object sender, Telerik.Web.UI.GridItemEventArgs e)
    {
        if (e.Item is GridEditableItem && e.Item.IsInEditMode)
        {
            GridEditableItem editItem = (GridEditableItem)e.Item;
            DropDownList ddl = (DropDownList)editItem.FindControl("DurationType-DDL");
            ddl.DataSource = (DataTable)GetTableForDropDown();
            ddl.DataTextField = "DurationType";
            ddl.DataValueField = "DurationType";
            ddl.SelectedIndex = editItem.ItemIndex;
            ddl.SelectedValue = DataBinder.Eval(editItem.DataItem, "DurationType").ToString(); // To get the selected value         
        }
    }


    public void DefineGridStructure(int i, PlaceHolder ph, Boolean bl)
    {

        RadGrid grid = new RadGrid();
        grid.ID = "RadGrid" + i.ToString();
        grid.Visible = bl;
        //grid.Height = Unit.Pixel(200);
        //grid.Height = Unit.Percentage(100);
        grid.Width = Unit.Pixel(775);
        grid.NeedDataSource += new GridNeedDataSourceEventHandler(grid_NeedDataSource);
        grid.AutoGenerateEditColumn = true;
        grid.AutoGenerateDeleteColumn = true;
        grid.AllowAutomaticInserts = false;
        //grid.Width = Unit.Percentage(100);
        grid.PageSize = 15;
        grid.AllowPaging = true;
        grid.AllowFilteringByColumn = false;
        grid.PagerStyle.Mode = GridPagerMode.NextPrevAndNumeric;
        grid.AutoGenerateColumns = false;
        //grid.MasterTableView.Width = Unit.Percentage(100);
        grid.MasterTableView.Width = Unit.Pixel(775);
        grid.MasterTableView.CommandItemDisplay = GridCommandItemDisplay.TopAndBottom;
        grid.AllowAutomaticDeletes = false;
        grid.AllowAutomaticUpdates = false;
        grid.ItemDataBound += new GridItemEventHandler(grid_ItemDataBound);
        grid.InsertCommand += grid_InsertCommand;
        grid.DeleteCommand += grid_DeleteCommand;
        grid.UpdateCommand += grid_UpdateCommand;
        grid.MasterTableView.DataKeyNames = new string[] { "RowNumber" };
        GridBoundColumn boundColumn = new GridBoundColumn();
        boundColumn.DataField = "RowNumber";
        boundColumn.HeaderText = "RowNumber";
        boundColumn.ItemStyle.Width = Unit.Pixel(5);
        boundColumn.ReadOnly = true;
        boundColumn.ItemStyle.CssClass = "maximize";
        grid.MasterTableView.Columns.Add(boundColumn);
        boundColumn = new GridBoundColumn();
        boundColumn.DataField = "Size";
        boundColumn.HeaderText = "Size";
        boundColumn.ItemStyle.Width = Unit.Pixel(5);
        boundColumn.ItemStyle.CssClass = "maximize";
        grid.MasterTableView.Columns.Add(boundColumn);
        boundColumn = new GridBoundColumn();
        boundColumn.DataField = "Description";
        boundColumn.HeaderText = "Description";
        boundColumn.ItemStyle.Width = Unit.Pixel(20);
        boundColumn.ItemStyle.CssClass = "maximize";
        grid.MasterTableView.Columns.Add(boundColumn);
        boundColumn = new GridBoundColumn();
        boundColumn.DataField = "Quantity";
        boundColumn.HeaderText = "Quantity";
        boundColumn.ItemStyle.Width = Unit.Pixel(5);
        boundColumn.ItemStyle.CssClass = "maximize";
        grid.MasterTableView.Columns.Add(boundColumn);
        boundColumn = new GridBoundColumn();
        boundColumn.DataField = "Unit";
        boundColumn.HeaderText = "Unit";
        boundColumn.ItemStyle.Width = Unit.Pixel(5);
        boundColumn.ItemStyle.CssClass = "maximize";
        grid.MasterTableView.Columns.Add(boundColumn);


        GridAutoCompleteColumn aboundColumn = new GridAutoCompleteColumn();
        aboundColumn.DataField = "Duration";
        aboundColumn.HeaderText = "Duration";
        aboundColumn.DataTextField = "Duration";
        aboundColumn.DataValueField = "Duration";
        //aboundColumn.AllowCustomEntry = false;
        //aboundColumn.SelectionMode = RadAutoCompleteSelectionMode.Single;
        boundColumn.ItemStyle.Width = Unit.Pixel(5);
        boundColumn.ItemStyle.CssClass = "maximize";
        grid.MasterTableView.Columns.Add(aboundColumn);



        GridTemplateColumn objGridTemplateColumn = new GridTemplateColumn();
        objGridTemplateColumn.HeaderText = "DurationType";
        objGridTemplateColumn.DataField = "DurationType";
        objGridTemplateColumn.ItemTemplate = new MyTemplate("DurationType");
        objGridTemplateColumn.EditItemTemplate = new MyEditTemplate();
        objGridTemplateColumn.ItemStyle.CssClass = "maximize";
        grid.MasterTableView.Columns.Add(objGridTemplateColumn);

        boundColumn = new GridBoundColumn();
        boundColumn.DataField = "Amount";
        boundColumn.HeaderText = "Amount";
        grid.MasterTableView.Columns.Add(boundColumn);
        boundColumn.ItemStyle.Width = Unit.Pixel(10);
        boundColumn.ItemStyle.CssClass = "maximize";
        grid.MasterTableView.EditMode = GridEditMode.InPlace;


        grid.ItemCreated += grid_ItemCreated;

        LinkButton lb = new LinkButton();

        if (bl == false)
        {

            lb.ID = "Show-Grid-" + i.ToString();
            lb.Text = "Show Area " + i.ToString();
            lb.Click += new EventHandler(ShowGrid);
        }
        else
        {

            lb.ID = "Show-Grid-" + i.ToString();
            lb.Text = "Hide Area " + i.ToString();
            lb.Click += new EventHandler(ShowGrid);
        }
        LinkButton lbd = new LinkButton();
        lbd.ID = "Delete-Grid-" + i.ToString();
        lbd.Text = "Delete Area " + i.ToString();
        lbd.Click += (sender, e) => DeleteGrid(sender, e, ph);

        Label lbl = new Label();
        lbl.ID = "Split-" + i.ToString();
        lbl.Text = "     |     ";

        Label lbb = new Label();
        lbb.ID = "Break-" + i.ToString();
        lbb.Text = "<br>";

        ph.Controls.Add(lb);
        ph.Controls.Add(lbl);
        ph.Controls.Add(lbd);

        ph.Controls.Add(grid);
        ph.Controls.Add(lbb);
    }


    private void grid_ItemCreated(object sender, GridItemEventArgs e)
    {

        if (e.Item is GridEditableItem && e.Item.IsInEditMode)
        {
            GridEditableItem editableItem = e.Item as GridEditableItem;
            TableCell cell = editableItem["Duration"];
            if (cell.Controls.Count > 0 && cell.Controls[0] is RadAutoCompleteBox)
            {
                ((RadAutoCompleteBox)(cell.Controls[0])).TextSettings.SelectionMode = RadAutoCompleteSelectionMode.Single;
                ((RadAutoCompleteBox)(cell.Controls[0])).AllowCustomEntry = false;
                ((RadAutoCompleteBox)(cell.Controls[0])).DataSource = GetTableForAuto();
            }
        }

    }
    }

Modified code for need_griddatasource just for testing

void grid_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
    {
        RadGrid grid = (RadGrid)sender;
        string id = grid.ID;

        for (int i = 0; i < HttpContext.Current.Session.Count; i++)
        {
            var crntSession = HttpContext.Current.Session.Keys[i];
            HttpContext.Current.Response.Write(string.Concat(crntSession, "=", HttpContext.Current.Session[crntSession]) + " Type of session is: " + HttpContext.Current.Session[crntSession].GetType() + "<br />");
        }

        HttpContext.Current.Response.Write("Last line current session is: " + HttpContext.Current.Session[1].GetType() + "<br />");

        if (HttpContext.Current.Session[1] == null)
        {
            HttpContext.Current.Response.Write("Session is null" + "<br />");
        }
        else
        {
            HttpContext.Current.Response.Write("Session is not null" + "<br />");
        }

        //DataTable current = (DataTable)HttpContext.Current.Session[1];
        //HttpContext.Current.Response.Write(current.Rows.Count);
        //DataTable current = (DataTable)HttpContext.Current.Session[int.Parse(id.Split(new string[] { "RadGrid" }, StringSplitOptions.RemoveEmptyEntries)[0])];
        //grid.DataSource = current;
    }

Below are the results that showed up:

when coming from CreasteEstimate1.aspx

CustomerInfo=Table1 Type of session is: System.Data.DataTable
Tables=1 Type of session is: System.Int32
1= Type of session is: System.Data.DataTable
Last line current session is: System.Int32
Session is not null

When coming from CreateEstimate2.aspx

Tables=1 Type of session is: System.Int32
1= Type of session is: System.Data.DataTable
Last line current session is: System.Data.DataTable
Session is not null

I don't know whats the difference and why it is happening like that

Was it helpful?

Solution

You are accessing a session variavble at index 1 and assume it is of DataTable type. But most likely it is Int32 and cannot be cast to DataTable.

Looking at your session dump:

when coming from CreasteEstimate1.aspx

Session[0] => CustomerInfo=Table1 Type of session is: System.Data.DataTable
Session[1] => Tables=1 Type of session is: System.Int32
Session[2] => 1= Type of session is: System.Data.DataTable

When coming from CreateEstimate2.aspx

Session[0] => Tables=1 Type of session is: System.Int32
Session[1] => 1= Type of session is: System.Data.DataTable

As you can see, Session[1] does not always contain System.Data.DataTable.

You can instead store your data table in Session["DataSource"]. If you have multiple data tables, store Dictionary<int, DataTable> in Session["DataSource"] and then access each table by the key. I'm sure you can find a unique value to use as a key.

Also Safer way of casting variables to nullable types is

var myVar=Session["MyVar"] as DataTable;

if(myVar !=null)
{
    //Do something with it
}

Reason behind it is that if for some reason your Session["MyVar"] is not of DataTable type, myVar will be null, instead of exception being thrown on cast.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top