Solved

asp.net - GridView columns to session object

Posted on 2010-11-19
12
665 Views
Last Modified: 2012-05-10
Hello,

I'm adding columns to a GridView in code:

Dim bf0 As BoundField = New BoundField()
..., etc

With bf0
            .HeaderText = "SKU"
            .DataField = "SKU"
            .HtmlEncode = False
            .SortExpression = "SKU"
            .ItemStyle.HorizontalAlign = HorizontalAlign.Left
            .ItemStyle.Wrap = False
 End With
 ..., etc

 With GridView1.Columns
            .Add(bf0)
            ..., etc
End With


Is there a way to save these columns in a session object, then on postback add them back to the GridView?

I tried:
 
       Session("GridViewColumns") = GridView1.Columns

Then:

       GridView1.Columns.Add(Session("GridViewColumns"))


... but this gives me "Value cannot be null. Parameter name: value"



Thank you.
0
Comment
Question by:Rick
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 2
  • +2
12 Comments
 
LVL 52

Expert Comment

by:Carl Tawn
ID: 34174538
Why would you want to? Normally you would simply re-add the columns on postback. If you're code to add the columns is in it's own method then you only need to call it.
0
 
LVL 12

Expert Comment

by:jagssidurala
ID: 34174615
For this generate dynamic grid differenrtky

the following link will explain way of dynamic gridview generation.

http://www.codeproject.com/KB/aspnet/dynamic_Columns_in_Grid.aspx

http://forums.asp.net/t/1020163.aspx

http://www.geekinterview.com/question_details/23647

see the links. in this links datatable is assigned as datasource to gridview.  place this datatable in Session object.

Session("Grid") = dt;
0
 
LVL 11

Expert Comment

by:MajorBigDeal
ID: 34174901
You could also just put the entire GridView in the Session which might be easier.  Do you need to keep it even after they leave the page? If not, the ViewState might be better than the Session.
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 13

Author Comment

by:Rick
ID: 34175290
I want to do this because my gridview has over 100 columns... and it takes a couple of seconds to create and setup all boundfields.

Right now, yes, on postback I call the method that adds the columns to the gridview...
I was wondering if I created the columns on first pass and stored them in a session object... would it not be faster to just grab them from the object rather than re-creating all columns?


Thank you.
0
 
LVL 52

Accepted Solution

by:
Carl Tawn earned 500 total points
ID: 34175517
Are these columns user specific, or the same for everybody? If it's the same for everyone then you could cache them in the Application object rather than individual sessions. That would give you the caching you want but without the memory overhead of storing them per user.
0
 
LVL 13

Author Comment

by:Rick
ID: 34176261
The columns are not user specific.

How do I cache them? ... and how do I retrieve them on postback?
0
 
LVL 12

Expert Comment

by:jagssidurala
ID: 34178096
No need caching should be done.

Based on user get those columns and bind to the grid view, that will be easy..

Read articles which i have posted in my earlier comment, those are exactly what you need.

instead of putting grid view in the session put the datatable in session and assign to the grideview in evry postback. that will be very easy and faster.
0
 
LVL 11

Expert Comment

by:MajorBigDeal
ID: 34178589
jagssidurala is correct - I should have said to store the datatable, not the gridview. Here is a small, simplified example.  Anytime you change the datatable

protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)            
   {
      // Do some stuff to generate the datatable  
      DdSourceTable = dt; // this line saves the datatable
   }
   RebindGridView(); rebinds the table from the Session
}

private void RebindGridView()
{
   gvFileList.DataSource = DdSourceTable; // this line retrieves the datatable
   gvFileList.DataBind();
}

// This property stores and retrives the database in the Session
private DataTable DdSourceTable
{
get { return Session["A_UNIQUE_STRING"] as DataTable ?? null; }
set { Session["A_UNIQUE_STRING"] = value; }
}
0
 
LVL 11

Expert Comment

by:MajorBigDeal
ID: 34178593
What I meant to say: anytime you change the datatable put it back in the session like this: DdSourceTable = dt;
0
 
LVL 11

Expert Comment

by:MajorBigDeal
ID: 34178606
And the same concept would also work for ViewState or Application objects depending on the scope of the data you are displaying in the table.  
0
 
LVL 52

Expert Comment

by:Carl Tawn
ID: 34180073
Ok maybe i'm missing something. What exactly has caching the DataTable (something you really don't want to be doing by the way) go to do with adding custom columns??
0
 

Expert Comment

by:bumbl3b33
ID: 34180172
There is no need to place the columns in session. The boundedfield can be added in the aspx page (at design tme) or at runtime. whatever you do, viewstate holds the control.

protected void Page_Load(object sender, EventArgs e)
        {  
            GridView1.AutoGenerateColumns = false;
            if(GridView1.Columns.Count==0 && !Page.IsPostBack)
                GridView1.Columns.Add(CreateColumn());
            BindData();
        }

        protected void btnTest_Click(object sender, EventArgs e)
        {

        }

        private BoundField CreateColumn()
        {
            BoundField bfield = new BoundField();
            bfield.HeaderText="SKU";
            bfield.DataField = "SKU";
            bfield.HtmlEncode = false;
            bfield.SortExpression = "SKU";
            bfield.ItemStyle.HorizontalAlign = HorizontalAlign.Left;
            bfield.ItemStyle.Wrap = false;
            return bfield;
        }

        private void BindData()
        {
            DataTable dt = new DataTable();
            DataRow dr = dt.NewRow();
            DataColumn dc = new DataColumn();
            dc.ColumnName = "SKU";
            dt.Columns.Add(dc);
            dr[0] = "sdfsdf";
            dt.Rows.Add(dr);
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The ECB site provides FX rates for major currencies since its inception in 1999 in the form of an XML feed. The files have the following format (reducted for brevity) (CODE) There are three files available HERE (http://www.ecb.europa.eu/stats/exch…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
Exchange organizations may use the Journaling Agent of the Transport Service to archive messages going through Exchange. However, if the Transport Service is integrated with some email content management application (such as an antispam), the admini…
Are you ready to implement Active Directory best practices without reading 300+ pages? You're in luck. In this webinar hosted by Skyport Systems, you gain insight into Microsoft's latest comprehensive guide, with tips on the best and easiest way…

749 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question