2008-12-04
Today I had to take care of a problem of a certain company (CIS) that I consult. They had a problem of keeping the values modified in a template field of a gridview when the user moves from one page of the grid to another.
Template fields allow us to add custom columns into a datagrid or gridview. For an instance, we can add a grid column which has a textbox in each cell.
When the gridview has several pages, the gridview holds only the rows that are displayed in its Rows (collection) property. So we cannot access the values in other pages using the gridview.Rows property.
Then I thought that I could access the whole collection of rows by referring to the DataSource property of the gridview. This is a good idea because even though the gridview only shows the rows on the current page for display purposes, the data source property of the gridview holds the whole collection of rows in it.
ASP.Net clears the data source of any control at post backs. This is done to optimize performance of communications. In addition, the state of each control is stored in ViewState so it is not necessary to keep the datasource between postbacks.
The problem is worse now because I could not use both datasource and the direct row collection from the gridview.
Of course we can use either cache or session to keep the datasouce.
Session["DataSource"] = dt; // store our table in the session
Then to synchronize (update) the datasource which was stored in the session we have to:
- Go to each row in the gridview
- Get the matching data row from the data table
- Update the fields of the data table row
Since we have enabled paging for the gridview, we have to do this when ever user changes the page he/she is viewing to preserve his/her modifications.
So we need to write our code in the PageIndexChanging event handler of the GridView.
In my example I have two columns of the grid view called “ID” and “Name” and the name is the only template column I have used so I am only updating that column in the stored data table.
Code:
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { // get the datatable from the DataTable dTable = (DataTable)Session["dataSource"]; // now we will iterate through all rows of the grid // then get the matching row from the data table (datasource of our grid) // and append the updated data (by the user) to the selected data row foreach (GridViewRow grv in this.GridView1.Rows) { // get the matching row from the data table DataRow dRow = dTable.Rows.Find(this.GridView1.DataKeys[grv.RowIndex].Value); // set values of updated columns : here I have only let the user to edit "Name" column dRow["Name"] = ((TextBox)grv.FindControl("txtName")).Text; } // go to the next page of the grid this.GridView1.PageIndex = e.NewPageIndex; this.GridView1.DataSource = (DataTable)Session["DataSource"]; this.GridView1.DataBind(); // show the whole collection of data in the second grid (used only to display) this.GridView2.DataSource = (DataTable)Session["DataSource"]; this.GridView2.DataBind(); }
I have used a different gridview called GridView2 to show the whole data source without paging.
So don’t misunderstand the use of GridView2 in the last section of the code. It’s used only do display the whole set of data (without paging).
I cannot upload my code into this blog because it seems like zip files are not supported. If you like to take a glance of my code just add a comment so I’ll send the code to you via email.
Was this post helpful to you? How can I improve? – Your comment is highly appreciated!
Cassian Menol Razeek
Hi,
I would like to go over you source code if possible. Could you please send i across?
Thanks,
Deep Kumar
LikeLike
Hi Kumar,
I sent the source code to the email that you had provided.
Glad to help you!
Menol
LikeLike
Hi,
Could you please send the source code of this. I need the gridview with checkboxes and textbox fields accross all the pages, I maintained their state when page index is changing in a session value , mean while am even binding those values in the Datatable when page index was changed.
But the problem here when i submit the page, only 1st page values are saved into the datatable.
Could u please send the source code of this so that i can check where did i go wrong in my code.
Thanks,
Bhanu Ananthoju
LikeLike
Hi Bhanu,
I sent the source code to the email that you had provided.
Glad to help you!
Menol
LikeLike
Hi Menol,
Thanks for providing the source but my requirement is with checkboxes and textbox fields along with paging. The code is just maintaing the modified fields in session of datatable. My Grid has two columns of checkboxes, image and a textboxes, Am maintaining the states of all the checkboxes and textboxes value too while paging in an arraylist for checkboxes and hashtable for textbox values. But the problem here is I need save all fields values accross pages which are selected and value entered in the textbox.
Thanks,
Bhanu Ananthoju
LikeLike
I like the article, its grate. i would love to check out the source code. thanks
LikeLike
do you know how to display a empty gridview?
LikeLike
Please send me source code.
LikeLike
Hi menol,
hope u r ok and doing well.
i need ur favour,that im struggling to keeping the 1st page template field values..while paging. could u plz forward the coding samples to me..
Thank u
Naveen.
LikeLike
Is is possible to have your source code? I’ve been searching for a solution to retaining values of textboxes in a gridview control.
Thanks,
Kemi
LikeLike
Hi,
I am having exactly the same problem as mentioned above(“How to Keep Modified Data of Template Fields when Paging is Enabled?”).Can you please provide me with the source code for this problem.
Any help would be appriciated.
Thanks in advance
Regards
Vikas Goyal
LikeLike
Please send me the code. I would like to go through it.
Regards
Siva
LikeLike
Hi Menol,
I would like to view the Source Code, Kindly Send it.
Thanks for your Help
Saravanan
LikeLike
Now all became clear, many thanks for the information. You have very much helped me.
LikeLike
Hi I would love to see the code for this as well.
thanks!
LikeLike
Hi,Can you please share the source code.
Thanks
LikeLike
HI,
i require code for above article , i am going with same situation.can you please send me code on above emil id
LikeLike
Hi.
Can you send me the code. I want to retain the textbox value in my gridview while paging.
Thanks in advance
LikeLike
Hi, Can you please send me the source code since I am confused about the column name used since we can’t have it for template fields. Need to retain textbox values during paging.
Thanks in advance
LikeLike
I have uploaded source code to this post. You can now download the solution (source code) via the link provided at the bottom of the post or this link.
LikeLike
hi Menon,
i am searching for this solution from many days but this was the apt post what u have sended thanku somuch and let me is tehre any personel blog having this kind of question and answer forum
thnk u
LikeLike
would you please send me the source code
LikeLike
Hi Mariam,
I emailed the code to you.
also fixed the download link.
LikeLike
Hello,
I m facing the same and exact problem for my college project which has dynamically generated textbox in each row of datagrid with total records of more than 5 to 6 lakhs… It would be of a great help for me if you can mail me the code.
Thanks.
LikeLike
Hi Lalitkumar, You can download the source-code via the link given in the post.
LikeLike
Dear Sir,
I am Rakesh Kumar. I have GridView with dropdowlnist, when i select an item from dropdownlist and click on next page of gridview the dropdownlist of previous page is not retain selected item. please send the correct code on my Email Id.
Thanks
LikeLike