ASP.NET: GridView Update/Edit/Cancel, HyperLinkFields, and DataKey Retrieval
Today was spent mostly tackling the GridView’s Update/Edit functionality, and I got incredibly frustrated, at first. This was my first foray into this part of the GridView’s functionality, since I haven’t really had to develop anything using it since the switch to 2.0, as everything in DataGrids still functioned fine. With a little bit of research, a lot bit of patience, and some help from the internet community, I was able to solve all my issues, and pretty elegantly at that.
Basically, I was trying to convert an existing data-display-only GridView (ie, no special functions) into one where I can update a field, namely the inventory for displayed products. After working with DataGrids so efficiently, I was scared that GridViews were going to be a million times more complex. I suppose my eyes got big when I saw all the new properties and methods, and wanted to try them all out. Big mistake.
Most articles I found were for hardcoded datasources (especially on MSDN, ugh) and didn’t really help me much, so this post will be referring to GridViews with dynamically bound datasources. First, create a GridView with three bound columns and an Update/Edit/Cancel (CommandField) column:
<asp:gridview id="GridView1" runat="server" autogeneratecolumns="False" onrowediting=GridView1_RowEditing datakeynames="productid" onrowcancelingedit=GridView1_RowCancelingEdit onrowupdating=GridView1_RowUpdating>
<columns>
<asp:hyperlinkfield datanavigateurlfields="productid" datanavigateurlformatstring="/products/index.aspx?productid={0}" text="Product" target="_blank" />
<asp:boundfield datafield="inventory" headertext="Inventory" />
<asp:commandfield showeditbutton="True" />
<asp:boundfield datafield="productid" visible="false" />
</columns>
</asp:gridview>
Nothing in there should be shocking to anyone: all your events are handled, you have a HyperLinkField that uses the DataNavigateURLFields property to insert a ProductID, and you have set your DataKeyNames property to your hidden field which holds your ProductID.
Because we are not using the GridView’s built-in data model and are binding dynamically, the GridView will not switch into and out of Edit Mode automatically. Thus, in order to switch it into Edit Mode, in each of your event handles (RowEditing, RowUpdating, and RowCancelingEdit) you must do two things:
- Change the GridView’s EditIndex appropriately
- Re-bind your GridView
These are both very easy to do, and your RowEditing and RowCancelingEdit handles should be simple, like this:
Protected Sub GridView1_RowEditing(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) GridView1.EditIndex = e.NewEditIndex 'set to selected row BindGridView() ' your own subroutine that you use to bind your datagrid End Sub Protected Sub GridView1_RowCancelingEdit(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) GridView1.EditIndex = -1 'set to no selection BindGridView() End Sub
One issue I ran into while attempting to figure this all out was if I didn’t rebind my GridView at the end of each event, I was required to click twice to get it to select the correct row, and if I clicked around, it would always be a row behind. So be sure to rebind your GridView at the end of your event handler.
The RowUpdating event is where it gets tricky, since pulling values is not necessarily intuitive. You can’t do something like GridView1(i)(j).Text = str
or anything even close. Instead, you must cast the cells as controls. Here’s an example of how I did it in my RowUpdating event handler:
Dim name As HyperLink Dim inv As TextBox name = CType(GridView1.Rows(e.RowIndex).Cells(0).Controls(0), HyperLink) inv = CType(GridView1.Rows(e.RowIndex).Cells(1).Controls(0), TextBox) ' .Cells(1) refers to the 2nd column
Once you’ve casted them, you can now easily get their values by invoking their .Text
property, ie, name.Text
. Remember that my first column was a HyperLinkField, so in order to pull that value, I must cast that column as a HyperLink.
Finally, to pull your hidden value that you’ve dubbed a DataKey in the GridView’s DataKeyNames
property, do the following:
Dim ProductID as Integer = GridView1.DataKeys(e.RowIndex).Value
EDIT 3/5/08: I forgot to mention in this article how to retrieve “Read-Only” data. You cannot convert a read-only cell into a textbox, so you must retrieve the value another way:
Dim str as String = GridView1.Rows(e.RowIndex).Cells([your cell]).Text
Then do whatever you need to do to update your database, set the EditIndex
to -1, and call your BindGridView()
subroutine. Everything should be sorted out when the “Update” link is pressed. To enhance this process, be sure to include your GridView in an AJAX UpdatePanel.
Hope this saves someone a full day of research (and possibly some hair)!
Thanks – was having a few problems trying to find examples without using hardcoded data sources. This has been very useful – rest easy in the knowledge you have made someone’s day easier!
Comment by Matt Fisher | September 28, 2007 |
Good, glad I could help 🙂 It was just so strange to me that everywhere I looked I found only examples of hardcoded data sources. Who uses hard coded data sources? Not this guy.
Comment by Some.Net(Guy) | September 28, 2007 |
your explanation was simple and clear. never using the gridview control before, i was nervous about trying to do this. but with you example, it was simple. i really want to thank you for your time spent putting this up on the web.
thanks a million
Comment by Dan Benjamin | October 19, 2007 |
@Dan –
You’re welcome 🙂 Thanks for the comment!
Comment by Some.Net(Guy) | October 19, 2007 |
Can you please upload small text file with code?
Which will really help everybody.
Rana
Comment by Rana | October 23, 2007 |
This was a really useful example.
Just one minor problem when casting, I receive the following error:
Unable to cast object of type ‘System.Web.UI.LiteralControl’ to type ‘System.Web.UI.WebControls.TextBox’.
Any ideas?
Comment by LG | November 21, 2007 |
LG –
Make sure that you are trying to cast the correct objects! I don’t know how you got a literal control in your GridView, but make sure that everything is parallel. For instance, here:
Dim inv As TextBox
inv = CType(GridView1.Rows(e.RowIndex).Cells(1).Controls(0), TextBox)
notice how I create inv as a TextBox and I’m casting the control in column 2 (which is actually .Cells(1).Controls(0)) as a TextBox. You may have something trying to cast a textbox as a literal, or vice versa. Make sure they match.
Comment by Some.Net(Guy) | November 21, 2007 |
here is what I am trying to do. The error still persist….Just not too sure what else to look for….
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
‘ get the cart from the Session object
Dim cart As Hashtable = CType(Session(“cart”), Hashtable)
‘ create a table to hold the item
dataTable.Columns.Add(New DataColumn(“drug_id”, GetType(String)))
dataTable.Columns.Add(New DataColumn(“drug_name”, GetType(String)))
dataTable.Columns.Add(New DataColumn(“drug_price”, GetType(Decimal)))
dataTable.Columns.Add(New DataColumn(“Quantity”, GetType(Int32)))
dataTable.Columns.Add(New DataColumn(“subtotal”, GetType(String)))
‘ Populate the table with items from cart
Dim de As DictionaryEntry
For Each de In cart
Dim shoppingItem As Item = CType(de.Value, Item)
Dim dr As DataRow = CreateNewDataRow(shoppingItem)
dataTable.Rows.Add(dr)
Next de
‘ get a databindable view of the datatable that can be sorted, etc
CartView = New DataView(dataTable)
CartView.Sort = “drug_name” ‘ sort items by name
If Not IsPostBack Then
BindGrid()
End If
End Sub
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
Dim name As TextBox
Dim price As TextBox
Dim quantity As TextBox
Dim drugid As TextBox
Dim subtotal As TextBox
name = CType(GridView1.Rows(e.RowIndex).Cells(0).Controls(0), TextBox)
price = CType(GridView1.Rows(e.RowIndex).Cells(1).Controls(0), TextBox)
quantity = CType(GridView1.Rows(e.RowIndex).Cells(2).Controls(0), TextBox)
drugid = CType(GridView1.Rows(e.RowIndex).Cells(3).Controls(0), TextBox)
subtotal = CType(GridView1.Rows(e.RowIndex).Cells(4).Controls(0), TextBox)
BindGrid()
End Sub
Comment by LG | November 22, 2007 |
LG –
Post your .aspx HTML GridView code, too. Maybe that will help.
Comment by Some.Net(Guy) | November 22, 2007 |
Here is the code behind the gridview.
<asp:TextBox ID=”TextBox1″ runat=”server” BackColor=”White” BorderStyle=”None” ReadOnly=”True”
Text=” Width=”136px”>
<asp:Label ID=”Label2″ runat=”server” Text=”>
<asp:TextBox ID=”TextBox2″ runat=”server” BackColor=”White” BorderStyle=”None” ReadOnly=”True”
Text=” Width=”64px”>
<asp:Label ID=”Label3″ runat=”server” Text=”>
<asp:TextBox ID=”LtxtQuantityGO” runat=”server” MaxLength=”99999″ Text=”
Width=”64px”>
<asp:Label ID=”Label1″ runat=”server” Text=”>
<asp:TextBox ID=”TextBox3″ runat=”server” BackColor=”White” BorderColor=”White”
BorderStyle=”None” ReadOnly=”True” Text=” Width=”64px”>
<asp:Label ID=”Label4″ runat=”server” Text=”>
<asp:TextBox ID=”TextBox4″ runat=”server” BackColor=”White” BorderColor=”White” BorderStyle=”None”
ReadOnly=”True” Text=” Width=”96px”>
<asp:Label ID=”Label5″ runat=”server” Text=”>
Comment by LG | November 22, 2007 |
LG –
Where’s the GridView? This is just random text boxes and labels…
Comment by Some.Net(Guy) | November 22, 2007 |
Sorry, disregard the last….hopefully this will post ok.
<asp:TextBox ID=”TextBox1″ runat=”server” BackColor=”White” BorderStyle=”None” ReadOnly=”True”
Text=” Width=”136px”>
<asp:Label ID=”Label2″ runat=”server” Text=”>
<asp:TextBox ID=”TextBox2″ runat=”server” BackColor=”White” BorderStyle=”None” ReadOnly=”True”
Text=” Width=”64px”>
<asp:Label ID=”Label3″ runat=”server” Text=”>
<asp:TextBox ID=”LtxtQuantityGO” runat=”server” MaxLength=”99999″ Text=”
Width=”64px”>
<asp:Label ID=”Label1″ runat=”server” Text=”>
<asp:TextBox ID=”TextBox3″ runat=”server” BackColor=”White” BorderColor=”White”
BorderStyle=”None” ReadOnly=”True” Text=” Width=”64px”>
<asp:Label ID=”Label4″ runat=”server” Text=”>
<asp:TextBox ID=”TextBox4″ runat=”server” BackColor=”White” BorderColor=”White” BorderStyle=”None”
ReadOnly=”True” Text=” Width=”96px”>
<asp:Label ID=”Label5″ runat=”server” Text=”>
Comment by LG | November 22, 2007 |
I guess not, somewhere it is truncating
Comment by LG | November 22, 2007 |
Again, no GridView 😦 You can email me at fixmysite.please[at]gmail if you want to.
Comment by Some.Net(Guy) | November 22, 2007 |
Sent…Thank you.
Comment by LG | November 22, 2007 |
LG –
I think I know why! You have some of your textboxes set to readonly=True. Remove that and try again.
Comment by Some.Net(Guy) | November 22, 2007 |
😦 no luck
Comment by LG | November 22, 2007 |
hmm…it may have something to do with the fact that you’re using templatefields instead of boundfields. create another gridview using boundfields (don’t delete this one!) and wire it up to what you have now. i think the only reason you’re using template fields anyways is for sizing reasons. in templatefields, i believe you have to use the “findcontrol” method to locate the textboxes.
example:
Dim t As New TextBox
t = CType(GridView.SelectedItem.FindControl(“TextBox1”), TextBox)
Try that and see if it works!
Comment by Some.Net(Guy) | November 22, 2007 |
Thank you. I have re-created the gridview with boundfields this time, and it works fine.
While in edit mode, how do I prevent some of the fields from being edited. I have tried to make them read only, but that does not work…any ideas?
Comment by LG | November 22, 2007 |
i’m getting error:
Specified argument was out of the range of valid values.
Parameter name: index
when i try to update my shopping cart gridview:
Protected Sub NGVCartRG_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles NGVCartRG.RowUpdating
Dim name As TextBox
Dim price As TextBox
Dim drugID As TextBox
Dim currQty As TextBox
Dim subtotal As TextBox
drugID = CType(NGVCartRG.Rows(e.RowIndex).Cells(0).Controls(0), TextBox)
name = CType(NGVCartRG.Rows(e.RowIndex).Cells(1).Controls(0), TextBox)
currQty = CType(NGVCartRG.Rows(e.RowIndex).Cells(2).Controls(0), TextBox)
price = CType(NGVCartRG.Rows(e.RowIndex).Cells(3).Controls(0), TextBox)
subtotal = CType(NGVCartRG.Rows(e.RowIndex).Cells(4).Controls(0), TextBox)
BindGrid()
End Sub
do you have an idea of what i’m doing wrong?
thanks!
Comment by NRGMS | November 25, 2007 |
@LG –
Making the fields read-only should make it so they cannot be edited… try making them read-only via the designer’s property editor for the gridview. if that doesn’t work, send me your new aspx source code and i will take a look.
@NRGMS –
there are a few things that could be wrong, just by your error, because the code you posted looks fine. the error that you’re getting means either your column count is off (you have fewer columns than you think) or your row count is off (you have fewer rows than you think). when does this error actually occur? is it when the user clicks the “update” button in your gridview? if you’d like, you could send your aspx code to me at fixmysite.please[at]gmail and i’ll take a look.
Comment by Some.Net(Guy) | November 25, 2007 |
Thanks. One quick question… For the update event I grab the values from the Grid but it does not get the new value typed into the text box. It gets the original value. I am trying to grab the new value so I can update the database. Did I forget something?
thanks,
Josh
Code:
Protected Sub GridView1_RowUpdating(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles dgChangeReportTitles.RowUpdating
Dim reportTitle As TextBox
reportTitle = CType(dgChangeReportTitles.Rows(e.RowIndex).Cells(1).Controls(0), TextBox)
Dim reportCode As String = dgChangeReportTitles.DataKeys(e.RowIndex).Value
Dim newReportName = reportTitle.Text
MsgBox(reportCode & “will be changed to ” & newReportName)
‘covera.changeReportName(reportCode, newReportName)
Comment by Josh | December 17, 2007 |
Josh –
It looks like you’ve got some reference issues. You’re calling the RowUpdating event for “GridView1” but you’re grabbing the report title from “dgChangeReportTitles”. That’s just the first thing I noticed. Let me know if that’s your problem, or if something else is amiss.
Comment by Some.Net(Guy) | December 17, 2007 |
Thanks for responding, but thats not it, I just forgot to change the names.
When I click the edit button, the reportname field changes to a text box like its supposed to. But then if I change the reportname and click update, it stays a text box and displays the original value, not the one I just typed in. I think I’m not binding the data correctly?
Here’s my code, let me know if anything else jumps out.
I am calling a web service to populate the grid and I have to use another to update the DB.
thanks,
Josh
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Session(“SessionID”) Is Nothing Then
covera.SessionHeaderValue = New CoveraServices.SessionHeader
covera.SessionHeaderValue.SessionID = Session(“SessionID”).sessionid
End If
Dim options As CoveraServices.MessageCode() = covera.displayAllReportTitles()
With dgChangeReportTitles
.DataSource = options
.DataBind()
End With
End Sub
Protected Sub dgChangeReportTitles_RowUpdating(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles dgChangeReportTitles.RowUpdating
Dim reportTitle As TextBox
reportTitle = CType(dgChangeReportTitles.Rows(e.RowIndex).Cells(1).Controls(0), TextBox)
Dim reportCode As String = dgChangeReportTitles.DataKeys(e.RowIndex).Value
Dim newReportName = reportTitle.Text
‘MsgBox(reportCode & “will be changed to ” & newReportName)
covera.changeReportName(reportCode, newReportName)
End Sub
Protected Sub dgChangeReportTitles_RowEditing(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs)
dgChangeReportTitles.EditIndex = e.NewEditIndex ‘set to selected row
dgChangeReportTitles.DataBind()
‘Dim options As CoveraServices.MessageCode() = covera.displayAllReportTitles()
‘With dgChangeReportTitles
‘ .DataSource = options
‘ .DataBind()
‘End With
End Sub
Protected Sub dgChangeReportTitles_RowCancelingEdit(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs)
dgChangeReportTitles.EditIndex = -1 ‘set to no selection
dgChangeReportTitles.DataBind()
‘Dim options As CoveraServices.MessageCode() = covera.displayAllReportTitles()
‘With dgChangeReportTitles
‘ .DataSource = options
‘ .DataBind()
‘End With
End Sub
Comment by Josh | December 18, 2007 |
Comment by Josh | December 18, 2007 |
not sure how to post the .aspx
<%–
–%>
Comment by Josh | December 18, 2007 |
Josh –
Are you using bound fields or template fields in your gridview?
Comment by Some.Net(Guy) | December 18, 2007 |
Go ahead and email me your aspx code… fixmysite.please at gmail.com
Comment by Some.Net(Guy) | December 18, 2007 |
bound fields, heres code without tags
GridView ID=”dgChangeReportTitles” runat=”server” onrowediting=dgChangeReportTitles_RowEditing onrowupdating=dgChangeReportTitles_RowUpdating datakeynames=”Code” Height=”1px” Width=”463px” AutoGenerateColumns=”False”
BoundField DataField=”Code” HeaderText=”Report Code” SortExpression=”ReportCode” ReadOnly=”True” InsertVisible=”False”
BoundField DataField=”Message” HeaderText=”Report Description” SortExpression=”ReportDesc”
commandfield showeditbutton=”True”
Comment by Josh | December 18, 2007 |
Josh, I think I know what it is. You’re not resetting the editindex to -1 before you rebind. Try that and let me know.
Comment by Some.Net(Guy) | December 18, 2007 |
now I am getting an ‘index out of range’ error for:
reportTitle = CType(dgChangeReportTitles.Rows(e.RowIndex).Cells(1).Controls(0), TextBox)
heres the rest of the update sub:
Dim reportCode As String = dgChangeReportTitles.DataKeys(e.RowIndex).Value
Dim newReportName = reportTitle.Text
‘MsgBox(reportCode & “will be changed to ” & newReportName)
covera.changeReportName(reportCode, newReportName)
dgChangeReportTitles.EditIndex = -1
dgChangeReportTitles.DataBind()
Comment by Josh | December 18, 2007 |
Josh –
You have to set your .DataSource before you can .DataBind! 🙂
Comment by Some.Net(Guy) | December 18, 2007 |
In fact, you need to do that on all your RowEdit/Update/Cancel event handlers…
Comment by Some.Net(Guy) | December 18, 2007 |
Now I am getting ‘object not set to instance of object when I try to get the value from the text box. Is it a text box or a bound field anyway. I am not getting along with GridViews.
thanks again. Heres more code.
Josh
‘reportTitle = CType(dgChangeReportTitles.Rows(e.RowIndex).Cells(1).Controls(0), TextBox)
reportTitle = CType(dgChangeReportTitles.Rows(e.RowIndex).FindControl(“Message”), TextBox)
Dim reportCode As String = dgChangeReportTitles.DataKeys(e.RowIndex).Value
Dim newReportName As String = reportTitle.Text
Comment by Josh | December 18, 2007 |
Josh –
Don’t use the .FindControl method… you will get the error you are saying you’re getting. “Message” isn’t the name of the bound field. Bound fields do not have names or IDs. Uncomment your first one, it’s correct. Here’s the process you have to follow in the RowUpdate (conceptually)
Create textbox variable
Cast bound field as texbox
Pull value from casted boundfield/textbox
Perform whatever actions you need
Reset EditIndex to -1
Reset your DataSource
Rebind your GridView
What I do when I’m having problems debugging is I will create a literal somewhere on the page and have it display whatever value I’m supposed to be retrieving while knocking every other thing out of the equation. Try doing that by ONLY pulling the reportTitle value from the GridView in your RowUpdate event, and maybe you will figure out what the problem is.
Hope this helps!
Comment by Some.Net(Guy) | December 18, 2007 |
great post, thx!
Comment by HF | December 21, 2007 |
Thanks for posting the helpful article.
Comment by GS | December 21, 2007 |
thanks alot you made my day !!
I sepend day and days searching and trying to do this in so many different ways until i got confused by all the googling but still couldnt find a decent example till today ! so thanks for your help
Comment by Eman | January 13, 2008 |
Great, thanks 🙂 Glad I could help!
Comment by Some.Net(Guy) | January 13, 2008 |
Hey!
I’m glad I quickly came upon your page, as I was about to take a plunge into cooking my own custom updating methods. Thanks a lot man!
😀
Comment by Jorge Sanchez | January 14, 2008 |
I’ve got an interesting question:
What if instead of showing the words “Edit/Update/Cancel” I want it to show something like “Change/Do it/Bail out!”?
Further more, what if I want to have images showing instead of the words?
Comment by Jorge Sanchez | January 16, 2008 |
Okay… sorry… silly me… EditImageUrl, CancelImageUrl, EditText :S
Sorry for wasting a few Kb’s on your database! Thanks anyway 😀
Comment by Jorge Sanchez | January 16, 2008 |
haha, no worries Jorge… that’s what this site is here for. Have you not seen my whole post where I wonder how to connect two projects? Hoo boy…
Comment by Some.Net(Guy) | January 17, 2008 |
Hey great post, looking for something like this for a long time.
However I’m having a problem with the rowupdating
I’m getting the old values. I looked at Josh’s post but i think mine is a diff issue.
after I press update the txtbox DOES contain the new value but in the update event i receive the old values.
I’m posting the code
dsQuizTableAdapters.tblQuestionsTableAdapter taQuestions;
dsQuizTableAdapters.tblQuizTableAdapter taQuiz;
dsQuiz ds;
protected void Page_Load(object sender, EventArgs e)
{
//manual connection
string conString = “DRIVER={MySQL ODBC 3.51 Driver}; SERVER=www.xxxx.com;” +
“DATABASE=quiz; UID=xxxx; PASSWORD=xxxxx; OPTION=3”;
System.Data.Odbc.OdbcConnection odbcCon = new System.Data.Odbc.OdbcConnection(conString);
System.Data.Odbc.OdbcDataAdapter odbcDa = new System.Data.Odbc.OdbcDataAdapter(“SELECT * from quiz”, conString);
DataTable dtQuiz = new DataTable();
ds = new dsQuiz();
taQuiz = new dsQuizTableAdapters.tblQuizTableAdapter();
taQuestions = new dsQuizTableAdapters.tblQuestionsTableAdapter();
GridViewQuestions.RowEditing += new GridViewEditEventHandler(GridViewQuestions_RowEditing);
GridViewQuestions.RowUpdating += new GridViewUpdateEventHandler(GridViewQuestions_RowUpdating);
taQuiz.Fill(ds.tblQuiz);
DDLquiz.DataSource = ds.tblQuiz;
DDLquiz.DataValueField = “id”;
DDLquiz.DataTextField = “name”;
if(!IsPostBack)
DDLquiz.DataBind();
loadQuestions(1);
}
void GridViewQuestions_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
System.Web.UI.WebControls.TextBox t = (System.Web.UI.WebControls.TextBox)GridViewQuestions.Rows[e.RowIndex].Cells[0].Controls[0];
System.Web.UI.WebControls.TextBox t2 = (System.Web.UI.WebControls.TextBox)GridViewQuestions.Rows[e.RowIndex].Cells[1].Controls[0];
}
void GridViewQuestions_RowEditing(object sender, GridViewEditEventArgs e)
{
Response.Write(“edit”);
//GridView GridViewQuestions =(GridView)(sender);
GridViewQuestions.EditIndex = e.NewEditIndex;
GridViewQuestions.DataBind();
Response.Write(e.NewEditIndex);
}
private void loadQuestions(int quizID)
{
taQuestions.FillByID(ds.tblQuestions,quizID);
GridViewQuestions.DataSource = ds.tblQuestions;
GridViewQuestions.DataBind();
}
and ASP
Comment by shooks | January 28, 2008 |
Shooks –
It appears as though you’re doing nothing in your RowUpdating event except assigning variables. You need to update your database and then rebind your GridView.
Hope this helps!
Comment by Some.Net(Guy) | January 28, 2008 |
Thanks for the quick reply
🙂 Yeah in the debugger i’m checking the values of t and t2 and i’m getting the old values
Comment by shooks | January 28, 2008 |
Shooks –
It appears that even though you are databinding, you’re not resetting the DataSource property in your RowEditing event. This may be leading to old values appearing.
This should put you on the right track!
Comment by Some.Net(Guy) | January 28, 2008 |
It looks like every postback refills the dataset from the database. I guess i need to use session variables, I hope it will work.
Thanks a bunch!!!!
Comment by shooks | January 28, 2008 |
Shooks –
You shouldn’t have to use session variables. What exactly are you trying to do, and maybe I can help you figure it out?
Comment by Some.Net(Guy) | January 28, 2008 |
I’m trying to fill my dataset according to a selection.
right now its hardcoded “loadQuestions(1)” this function uses a tableadaptor to fill my “questions” dataset table.
now I simply connect the GridView’s datasource to that dataset “questions” table and use the built-in edit button. I capture the events as shown in the code.
I’m guessing that each time the page posts back it runs the “loadQuestions(1)” and therefor it “refreshes” the dataset with the sql query. thats why I thought I needed session variables to hold the dataset and to fill it only once.
btw I’m connecting to a mysql database.
Comment by shooks | January 28, 2008 |
Ok – I have some forms that perform similar operations. To avoid getting your old data, you need to make sure that you update your table based on the new input BEFORE the RowUpdating event is called, because, yes, every time an event occurs, the page runs through the complete lifecycle in order. You can check the IsPostBack variable to run some more logic to make sure the correct loadQuestions(x) is being run.
Let me know if you need anything else!
Comment by Some.Net(Guy) | January 28, 2008 |
I got it sorted out with the dataset stored in a session variable and ispostback logic.
Thanks for your help and quick replies.
untill next time 😉
Comment by shooks | January 28, 2008 |
next time came quick :S
for some reason when I update the row it doesn’t change the values of the row in the dataset, kind of makes binding useless. Am I doing something wrong?
Comment by shooks | January 29, 2008 |
If you’re not binding it to something pulled directly from the database (ie, something pulled from a session variable), you need to make sure that you update both your database and your other data source BEFORE you complete your RowUpdating event. I had this problem when I was using Generics bound as a datasource; I updated my DB but not my object, and since the object was bound to the GridView and not my DB, it didn’t appear updated, even though it was.
Hope this helps!
Comment by Some.Net(Guy) | January 29, 2008 |
nice one
Comment by love | February 8, 2008 |
really i would like to thanks you……
I want to join dotnetdiscussion group.
plz add me or tell me what i have to do to add here and join discussion.
Thanks & Regards
S.N.Patel
Comment by shiv narayan patel | February 15, 2008 |
i wrote the same code for updating but when i press update button ,an exception fires up and tells me that datakeys index is negative , i don’t know , what is my mistake
Comment by nastaran | February 15, 2008 |
nastaran –
post your code here (with your .aspx) and i’ll take a look. remember to escape your left angle bracket characters (<)
Comment by Some.Net(Guy) | February 15, 2008 |
here is the code i wrote
protected void GridViewPackage_RowEditing(object sender, GridViewEditEventArgs e)
{
GridViewPackage.EditIndex = e.NewEditIndex;
databind();
}
protected void GridViewPackage_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
GridViewPackage.EditIndex = -1;
databind();
}
protected void GridViewPackag_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
//this line has problem
int index =Convert.ToInt32(GridViewPackage.DataKeys[e.RowIndex].Value);
updatesatements;
databind();
}
Comment by nastaran | February 15, 2008 |
nastaran –
did you declare what your datakeys were in your aspx code?
<asp:gridview id=”GridView1″ runat=”server” datakeynames=”yourdatakeyfield”>
also, did you declare more than one field to be a datakey? if you did, there’s a slightly different syntax for getting the datakey value.
Comment by Some.Net(Guy) | February 15, 2008 |
i define the datakeynames and i have just one datakey
Comment by nastaran | February 15, 2008 |
hmmm…. i don’t see anything obvious…is it possible that your data cannot be converted into an integer? although that wouldn’t explain the negative index. is your debugger telling you it’s breaking at that point? if you want, send your .aspx and your .aspx.cs file to fixmysite.please [at] gmail.com and i’ll take a closer look.
Comment by Some.Net(Guy) | February 15, 2008 |
I have similar reqirement for the GridView and were not able to find a solution for a while on the web until I found this one.(Update/Cancle no show on clicking Edit). Thanks very much for the frustration relief.
Comment by Renay | February 18, 2008 |
Thanks very much for this, a straightforward example detailing the functions of the GridView.
This article was the one out of many that really helped. Thanks again!
Comment by Daren | February 27, 2008 |
hello
i have a repeater i have a table
this table contains some data , and the header and number of columns in the table change depend on some condition ?
can anybody help me?
Comment by nastaran | February 27, 2008 |
Nastaran –
Try to modify this code snippet for your purposes:
For i As Integer = 0 To [some number or upperbound(0)]
If [some condition] Then
GridView1.Columns(i).HeaderText = [some text]
GridView1.Columns(i).Visible = True
Else ‘make unused fields invisible
GridView1.Columns(i).Visible = False
End If
Next
Hopefully this points you in the right direction 🙂
Comment by Some.Net(Guy) | February 27, 2008 |
no i have a repeater not a gridview
inside a repeater i have a table
Comment by nastaran | February 27, 2008 |
how do you form your table? is it manually (ie, forming tr/td tags) or object-oriented (ie, creating table, table row, and table cell objects)?
Comment by Some.Net(Guy) | February 27, 2008 |
it’s table object ()
Comment by nastaran | February 27, 2008 |
Not sure you still see these but am getting ‘… argument out of range …’ error. Am trying to dynmicaly create update statement (needs additional coding, I know). Some items are read-only in the gridview. Code below. Thoughts?
Protected Sub gvResults_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles gvResults.RowUpdating
Dim strUpdCmd As String = “”
Dim intX As Integer = 0
Dim txtTemp As New TextBox
Dim x As String = “”
strUpdCmd = “UPDATE TBLWORESCHED SET ”
For intX = 1 To gvResults.Rows(e.RowIndex).Cells.Count – 1 ‘Already know the first cell is the edit cell
‘x for testing
x = “rows ” & gvResults.Rows.Count.ToString & “, ” & _
e.RowIndex.ToString & ” and cells ” & gvResults.Rows(e.RowIndex).Cells.Count.ToString & _
“, ” & intX.ToString
txtTemp = CType(gvResults.Rows(e.RowIndex).Cells(intX).Controls(0), TextBox)
If txtTemp.ReadOnly = False Then
strUpdCmd = strUpdCmd & txtTemp.Columns.ToString & ” = ” & txtTemp.Text
End If
Next
gvResults.EditIndex = -1
SqlDataSource1.SelectCommand = ViewState(“SqlSelect”)
gvResults.DataBind()
End Sub
Comment by dczimmer | March 4, 2008 |
Donald –
I think you’re messing up in the “txtTemp.Columns.ToString”. That will only get you how many columns are in your textbox that you have dynamically created in memory. So essentially, if your textbox has 20 columns (20 characters allowed, I think is the default) you’re trying to set 20 = [whatever text is in the box], which should throw some sort of error.
Let me know if that fixes your problem.
Comment by Some.Net(Guy) | March 4, 2008 |
Thanks for the quick response. I’ve learned more about the gridview in this thread than I have in 2+ days searching the internet. Thanks again.
I commented the line out and still get the error. I should have been clearer as the error is being thrown at:
txtTemp = CType(gvResults.Rows(e.RowIndex).Cells(intX).Controls(0), TextBox)
Comment by dczimmer | March 5, 2008 |
Ah, ok it all makes sense now. You cannot convert a “read-only” item into a textbox, because it does not turn into a textbox! The way you retrieve read-only information is
value = GridView1.Rows(e.RowIndex).Cells([cell number]).Text
Try that and tell me if that helps!
Comment by Some.Net(Guy) | March 5, 2008 |
I’ll give it a try. My debugger is acting up. A thought, when the row goes to update mode does the cell index change by the number ‘functions’ (update, cancel) available? Example cell 0 was Edit and cell 1 was (first bound data cell). In update is both Update and Cancel in cell 0?
Comment by dczimmer | March 5, 2008 |
It is a readonly issue. I had my column count wrong. Is there a way to eval if the cell is readonly and bypass it? Otherwise I am going to hard code the edited cells. Thanks again.
Comment by dczimmer | March 5, 2008 |
Donald –
In response to comment 74, no, the index stays the same. As for checking to see if a cell is readonly, maybe check the Enabled property? I haven’t tested it, so I can’t say for sure, but it may work. You could also do a “Try…Catch” where if casting throws an error, assume it’s readonly, but this is not the correct solution, just a way to do it.
Comment by Some.Net(Guy) | March 5, 2008 |
Hi it’s nice to have ur code. but i have a problem, for the update event Iam taking the values from the Grid but it does not get the new value typed into the text box. It gets the original value. I am trying to get the new value so I can update the database. Did I forget something?
thanks,
Comment by Persis | March 6, 2008 |
Persis-
What’s your RowUpdating event look like?
Comment by Some.Net(Guy) | March 6, 2008 |
Sorry to bother you again. The following conditions apply. VS2005 using Oracle data provider (10.x) for .NET. I have a search page that limits what the user can request. The intent was to dynamically build the query to get the data based on what the user provides using like’s, and’s, and between’s; again depending on the user enters. On the called page is a gridview with a SQLDatasource configured for the Oracle .NET data provider.
The SQLDataSource has only a Select command with no WHERE clause, no SelectParameters, and no UPDATE, INSERT, or DELETE commands (or parameters). On page_load I get the values from the previous page then append the custom created where clause to the SelectCommand, do a viewstate on the new select command, then do a databind on the gridview and the data is there. My _rowediting and _roweditingcancel contain a reference to the rowed in edit mode (or -1), a setting of the SelectCommand to the saved viewstate entry and the gridview databind. All is good.
Then I do an update. The _rowupdating generates an update statement based on the values populated from the gridview (thanks again for your code) not using parameters but coding the statement. SQLDataSource updatestatement is set and the SQLDataSource update function called. The editing index is set back to -1, the SelecetComand is set to the viewstate variable and the gridview databind is called.
The database update occurs (as evidenced by looking in the database). The databinding event is throwing an ORA-01036: illegal variable name/number. I suspect thru much, much searching that there is a parameter binding/typing issue but I can not figure out where to look. Or, I am completely out to lunch …. Any assistance would be appreciated.
Comment by dczimmer | March 6, 2008 |
Donald –
I’ll be honest, I don’t have much experience with Oracle databases; I typically use MySQL. However, from the error code “ORA-01036” it appears that it is an error thrown from your database, not from your code, although the result of the error is undoubtedly in your code. What I would do is create a literal or label or something and instead of updating your database, set your literal to the SQL string generated for when you would typically update your DB. You may find your problem in there.
If not, without seeing code, I can’t be of much more assistance.
Hope this helps!
Comment by Some.Net(Guy) | March 6, 2008 |
Can I send you the code? My email is provided above.
Comment by dczimmer | March 6, 2008 |
Sure, send it to fixmysite.please[at]gmail.com
Comment by Some.Net(Guy) | March 6, 2008 |
[Comment 77]
Hi, this is RowUpdating event code
Dim inv As TextBox
inv = CType(ViewStatus.Rows(e.RowIndex).Cells(2).Controls(1), TextBox)
Dim StatusID As Integer = ViewStatus.DataKeys(e.RowIndex).Value
MsgBox(inv.Text)
ViewStatus.EditIndex = -1
ViewStatus.DataSource = posDet.getStatus
ViewStatus.DataBind()
”But this code gives me the Old value not the New Value
help me out
Comment by Persis | March 6, 2008 |
Persis –
Your old value will continue to appear in your gridview until you update the source. It looks like all you’ve done is take the value and put it in a textbox, but not done any storing of the value. Also, are you sure that it’s the second control (.Controls(1))? If it’s a bound field, the control index will always be 0. The only time it would be different is if it is a template field.
Hope this helps shoot you in the right direction!
Comment by Some.Net(Guy) | March 7, 2008 |
u r right, but b4 updating the datasource iam trying to get the eidted text from the textbox to update the datasource.But it returns the old value only.And there’s nothing wrong with the (.Controls(1)).
”This is the update statement
MsgBox(inv.Text)
UpdateStatus(StatusID, inv.Text)
”Refersh the source again
ViewStatus.EditIndex = -1
ViewStatus.DataSource = posDet.getStatus
ViewStatus.DataBind()
Thanks yaar.
Comment by Persis | March 8, 2008 |
Persis –
I do believe that you should not be using .Controls(1). If your column is a bound column, you will never use .Controls(1), and if your column is a template control, you will have to use a different method to capture your data (.FindControl). Try using .Controls(0), unless you can explain why you are using .Controls(1). I just can’t see why you would.
Comment by Some.Net(Guy) | March 10, 2008 |
”Thanks again, this is the Source Code
<asp:Label ID=”Statuslbl” runat=”server” Text=”>
<asp:TextBox ID=”StatusName” runat=”server” Text=”>
”Help me to get the new values
Comment by Persis | March 11, 2008 |
Inside the template field, the first control is Label and second control is TextBox and for the Text Property iam binding the Bind(“StatusName”)
Comment by Persis | March 11, 2008 |
My values were disappearing on PostBack too, so I worked around it by using the old school Request.Form call.
Turns out I’d made a really rookie mistake in my Page Load call and was filling the data on every postback and not just on the first page load. As a result my amended valuse were getting over written before the RowUpdating method executed.
What a dullard… hopefully this will help someone else… if not you can at least have a giggle at my expense!
Comment by Kathryn | April 3, 2008 |
[Comment 89]
Thanks very much for posting, Kathryn! I was doing exactly the same thing and couldn’t figure it out til reading your comment! Much appreciated.
A fellow dullard!
Comment by Mike | March 12, 2010 |
How to get the values of gridview cells in
a button click event when the grid view contains both boundfields and template fields
Comment by malik | June 19, 2008 |
plz help any one ,its urgent
in advance thnx
Comment by malik | June 19, 2008 |
Oh my god… I have been trying to figure this out for ALL DAY. I have been skimming books, Googling, testing… nothing worked, until I found this! This article is GREAT!
Comment by Troy Campbell | July 4, 2008 |
Troy –
Thanks for the comment! I’m glad I could help 🙂
Comment by Some.Net(Guy) | July 7, 2008 |
[…] Read more … […]
Pingback by Gridview » Blog Archive » ASP.NET: GridView Update/Edit/Cancel, HyperLinkFields, and DataKey Retrieval | July 13, 2008 |
This is very usefull article
I want to know, how can we Update just the row of a gridview with new values from edit mode , without the data base been updated.
Thanks
Comment by Hammad | July 18, 2008 |
Hammad –
Unfortunately your GridView is bound to your database, so any data you display is pulled directly from there. It doesn’t have its own “internal memory”, if you will. Sorry, and thanks for the comment!
Comment by Some.Net(Guy) | July 18, 2008 |
Hey,
When I click update my new values don’t appear on the row after postback. Through debugging i know the values are being stored in their respective textbox values. I take it that I need to write code to actually do the updating other than the GridView1_Updating sub. Could someone lay out how this could be done? Also, i am slightly lost on the purpose of the DATAKEY and if this could be explained i would be happy as well. do not hesitate to be explicit, as i am fairly daft in this environment. My code for the edit/updating is below. A world of thanks, in advance.
Protected Sub GridView1_RowEditing(ByVal sender As Object, ByVal e As GridViewEditEventArgs) Handles GridView1.RowEditing
GridView1.EditIndex = e.NewEditIndex
CompleteFill()
End Sub
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As GridViewUpdateEventArgs) Handles GridView1.RowUpdating
Dim idx As Integer
Dim cell As DataControlFieldCell
Dim testInt As Integer
Dim code As TextBox
Dim plabel As TextBox
Dim blabel As TextBox
Dim comm As TextBox
Dim ID As Integer
code = CType(GridView1.Rows(e.RowIndex).Cells(8).Controls(0), TextBox)
plabel = CType(GridView1.Rows(e.RowIndex).Cells(9).Controls(0), TextBox)
blabel = CType(GridView1.Rows(e.RowIndex).Cells(10).Controls(0), TextBox)
comm = CType(GridView1.Rows(e.RowIndex).Cells(11).Controls(0), TextBox)
GridView1.EditIndex = -1
CompleteFill()
‘ Dim commie As String = comm.Text
End Sub
Protected Sub GridView1_RowCancelingEdit(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles GridView1.RowCancelingEdit
GridView1.EditIndex = -1 ‘set to no selection
CompleteFill()
End Sub
Comment by Ben | July 21, 2008 |
Ben –
It appears as though you are doing almost everything right. First, I don’t know what your CompleteFill() sub does, but I assume it rebinds your GV. Second, in your RowUpdating, assuming that your respective columns in your GV are textbox columns, you are correctly pulling the values. However, you are doing nothing with those values after you pull them! Once you get your plabel, blabel, comm values, then what? You probably want to put them into your database.
As for datakeys, they are useful for storing the ID of whatever your records are in your GV. For instance, if you have products, make a bound column for your ProductID and set visible=False, then set your ProductID as your GV’s datakey. That way you can easily pull your ProductID via the code:
Dim ProductID as Integer = GridView1.DataKeys(e.RowIndex).Value
without having to worry about what cell it’s in or casting it to a control. I find it very useful and easy to work with.
Hope this helps!
Comment by Some.Net(Guy) | July 21, 2008 |
Hey, Thanks for the article!!!
I have a question, it may be a little out of the scope of this article but help me if you can.
I have a page with a GridView with edit/delete/add
The gridview loads a Control in a new row(under) the row that was clicked on. I do this in the rowdatabound event. What happens now is the row is in edit mode and a new gridview (with edit/delete/add) is loaded under this row. Now when I click on edit on the loaded control’s girdview everything works fine the page loads and in the databound event it checks to see the row state, if its in edit mode it loads the control, but for this to work I need to bind the parent gridview on page load. So now If i want to update the parent Row (the one that was clicked and loaded the control underneath it) It binds on pageload before it updates… so it always reverts to the old values. I tried many things to fix this… but no luck…
There is no way for me to check in the page_load of the parent page what was clicked… if its the update button of the parent control or an edit/update button of the child control so I cannot apply the databind selectively.
Its a little confusing, I hope you understand….
Thanks
T.
Comment by T. Ski | July 22, 2008 |
T –
Honestly I don’t really get what you’re trying to do, but whatever it is may be more difficult than what you need! From what I gather about what you’re doing, you may just want to convert your form into a Master/Child format, where your GV is the Master and when clicked, it pulls up editable details in the Child form (which could be another GV or a series of textboxes and a submit button). Sorry I can’t be of much more help, but I’d need to see a bit of code.
Hope this helps!
Comment by Some.Net(Guy) | July 22, 2008 |
Thanks for the quick response…
I’m loading a usercontrol because i know no other way to insert a new row into a gridview where i can control the column span… i’m trying to do this (i’ll use ascii art to demonstrate)
|–|–|–|
|——–|
|–|–|–|
so the top row was clicked and opened a new row (with column span 3 in this case) in this row i’m loading a userControl that takes as a parameter the rowid that was clicked and displayes the relevant gridview.
Can this Master/child format accomplish the same result?
Comment by T. Ski | July 22, 2008 |
T –
Gotta love ASCII art 🙂 I see what you’re trying to do, and it still seems overly complex… Just have a Master form with a “Select” button that when it is clicked, it puts the Master form into “Selected” mode for that row and transfers the ID of that row to a Child form which pulls up all the relevant info. Of course I don’t know the purpose of the form, so maybe you really need to do what you’re doing, but I can’t see how it would be imperative that you do.
If you need more info, let me know and I’ll give you some more concrete examples.
Comment by Some.Net(Guy) | July 22, 2008 |
This Master/Child is new to me… sounds interesting.
What i’m trying to do is a little different than what you describe. What happens when the (parent) row is clicked is that it turns editable (so fields of the row can be modified and updated) at the same time the child row (that contains another gridview) is loaded and rows in this new gridview can be edited as well.
I will demonstrate with a good example (and the actual use of this model).
Basically its a quiz with many questions, so the first page that loads contains all the questions(in a GV). When you click to edit a question you get another GV with question options that can be edited as well
(question = Do i know .net?, question options = Yes, No).
If this Master/Child Model you are describing can handle this UI I would love to get more information about it, please refer me to some good sources.
Thank You
Comment by T. Ski | July 22, 2008 |
T –
I think I have found an article that is doing what you are trying to do, or at least should point you in the right direction:
http://www.codeguru.com/columns/vb/article.php/c12647/
Let me know how that works out for you!
Comment by Some.Net(Guy) | July 22, 2008 |
Thank you very much!!!
This article is very helpful.
Not often do we meet people willing to help without asking for anything in return.
peace be upon you
T
Comment by T. Ski | July 22, 2008 |
My pleasure, T! If you really want, you could buy me a beer 🙂 Good luck w/your app!
Comment by Some.Net(Guy) | July 22, 2008 |
Thanks For your Reply.
I have a data table which is fiiling values in Gridview and i want to EDIT Those values, which is not Connected to Dsta base at all , these values are been taking by users and then inserted in data bases.
Comment by Hammad | July 22, 2008 |
Hammad –
If you want values to be reflected when you edit them, you must update the source. Updating just the data in the GV but not updating the source is like taking a freshly cut circular cookie and changing it into a star shape and then expecting your next cookie to come out looking like a star. You need to update the cutter! Your GV will continue to display whatever values there are in your datatable. The only thing I can think of is to create a datatable in memory and draw your values from that, but that’s getting really complex with determining which is your datasource.
Hope this makes sense!
Comment by Some.Net(Guy) | July 23, 2008 |
Actually i have Created a Datatable, and the Update is working in a way that when Update Button is clicked is add new row in the grid view , rather Updating the Selected row.
Please Also Tell me how can i delete a row from grid view , which is fiiling from datatable,and not with database.
Comment by Hammad | July 23, 2008 |
Hi, I posted in #97, and was answered in #98, but am still horribly lost. the response given is below in the quote boxes. The gist is that I have tried since that day to put the values for those variables into my excel file but am failing at every turn. I would appreciate if someone could show me exactly what it is i should be doing, because everything i research on the internet does not apply to me. I have copied my code in the code brackets and added the response in the quote brackets below to make things easier.
[quote]It appears as though you are doing almost everything right. First, I don’t know what your CompleteFill() sub does, but I assume it rebinds your GV. Second, in your RowUpdating, assuming that your respective columns in your GV are textbox columns, you are correctly pulling the values. However, you are doing nothing with those values after you pull them! Once you get your plabel, blabel, comm values, then what? You probably want to put them into your database.[/quote]
I know that the values are being retrieved into my variables but am at a complete lost as to how to get them inserted into the excel database and binded properly. no manner of explicit explanation would insult my intelligence at this point.
I appreciate any help you all my provide.
Thanks,
Ben
Comment by Ben | July 28, 2008 |
Ben –
I don’t know how you are binding your site to an excel database! I assumed you were using a MSSQL or MySQL database to maintain all your data. Even an XML database would suffice, but I don’t know how to connect to an Excel DB, I’m sorry! Good luck!
Comment by Some.Net(Guy) | July 28, 2008 |
i see. alas. Well I do appreciate the help. could you perhaps still post what it would take to insert values of the variables into the database after having established the CTypes. I might be able to figure it out from there. it, like obiwan, is my only hope.
Comment by Ben | July 28, 2008 |
Ben –
If you’re using a database, you need to create some sort of INSERT string to send to your DB with all your info. For instance, if you are updating a MySQL database, you could send the following string:
INSERT INTO tblproducts (name, color) VALUES (‘widget’,’red’)
Maybe that will send you off in the right direction!
Comment by Some.Net(Guy) | July 28, 2008 |
Please Tell me how can i Change Textbox values on KeyPress event , like i have 3 textboxes, textbox1,textbox2 and textbox3 , when press tab key values from textbox 1 and 2 get added and displayed in textbox 3.
Comment by Hammad | July 30, 2008 |
can you help me in generating PDF reports on the Fly in VB.net 2005.
Comment by Hammad | August 5, 2008 |
Sir,
I really surprised bcoz i m working in a small company . I am searching for an article on gridView editing and i typed i started searching in Google suddenly i switched to this site. I found tht i actually gone through this site so many times before. This is my Fav. Sir’s NagRaj (MCAD) Site..Thanq sir this site helped me a lot ..
Small Req
Can you send me a small article on GridView Editing ..
ThanQ V much….
Comment by hariprasad | August 29, 2008 |
Hi ,
This is Sharma, i am not getting gridview_RowUpdating()and gridview_RowDeleting() function in Gridview asp.net2.0 with c# code. Please help me please. This is my mailID “k.sharmasvali@gmail.com”
Thanks & Regarding
Sharma.
Comment by k.sharmasvali | October 28, 2008 |
i have a problem with the data
in my GridView1_RowUpdating
Dim name As TextBox
Dim ip As TextBox
Dim coment As TextBox
Dim type As TextBox
Dim str As Integer = GridView1.Rows(e.RowIndex).Cells(1).Text
name = CType(GridView1.Rows(e.RowIndex).Cells(2).Controls(0), TextBox)
ip = CType(GridView1.Rows(e.RowIndex).Cells(3).Controls(0), TextBox)
coment = CType(GridView1.Rows(e.RowIndex).Cells(4).Controls(0), TextBox)
type = CType(GridView1.Rows(e.RowIndex).Cells(5).Controls(0), TextBox)
when i look into name.text i see the old data and not the new one
Comment by eyal | December 17, 2008 |
Great idea and very simple method to update the row in datagridview. But I find that you cannot use this method for a dropdownlist in datagrid, e.g you cannot do this:
CType(GridView1.Rows(e.RowIndex).Cells(5).Controls(0), dropdowlist). Instead I have to use this:
CType(GridViewNotification.Rows(e.RowIndex).FindControl(“DropDownStatus”), DropDownList)
Do you know why?
Comment by Larry from candida diet | February 23, 2009 |
Larry –
You’re correct. This is a simple example for simple databound fields. When you start getting into TemplateFields, or the only way to include dropdowns in your GridView, your method is the way to do it.
Thanks for the comment!
Comment by Some.Net(Guy) | February 23, 2009 |
thanx… it really helped me a lot.. i had wasted 1 day working on this… thanx for the solution
Comment by ratul | March 1, 2009 |
Hello everyone,
I’m trying to develop a page in ASP.net(C#) which has a gridview,a radiobutton list and a submit buttton.The procedure is like first the row should be selected then
radio button should be selected and then submit button should be clicked.On clicking submit the column in gridview(app_status)should get updated based on userid.Datakeyname is registration_no.
Here is the cs file I’m Unable to proceed as I getting no result and no error:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class munoffgui : System.Web.UI.Page
{
int index;
String selid;
protected void GridView1_RowCommand(Object sender,GridViewCommandEventArgs e)
{
if (e.CommandName == “Select”)
index = Convert.ToInt32(e.CommandArgument);
GridViewRow row = GridView1.Rows[index];
selid = Server.HtmlDecode(row.Cells[14].Text);
Label2.Text = selid;
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlDataSource1.Update();
}
}
Plz help me.It’s urgent!!!!
Thnx in advance
Comment by coolguy.net | March 10, 2009 |
Hello everyone..
Im trying to develop a page which has gridview.It has got 3 columns. One is image.
My problem is i cant update my database table using that. I have gone through the above posts.. Still i cant makeout.
My probs are:
1.I cant get the new value from the text box. It takes the old value only.So the update command updates using the old values.
2.I want to get the fileupload fild for my image filed.
Im using the name of the file from fileupload filed to store it in database and retriving from folder to diaplay in the gridview.
Here is my code:
Partial Class Administration_Default2
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim ds As New Data.DataSet
Dim da As Data.SqlClient.SqlDataAdapter
Dim strSQL As String
strSQL = “Select * from Category”
Dim connString As String = “Data Source=.\SQLEXPRESS;AttachDbFilename=””|DataDirectory|\chocobar.mdf””;Integrated Security=True;User Instance=True”
da = New Data.SqlClient.SqlDataAdapter(strSQL, connString)
da.Fill(ds)
ds.Tables(0).Columns.Add(“imgfile”)
For Each tempRow As Data.DataRow In ds.Tables(0).Rows
tempRow.Item(“imgfile”) = (“./image/” & tempRow.Item(“cat_image”))
Next
Grid1.DataSource = ds
Grid1.DataBind()
Return
End Sub
Protected Sub Grid1_edit(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs)
Grid1.EditIndex = e.NewEditIndex ‘set to selected row
Grid1.DataBind()
End Sub
Protected Sub Grid1_Cancel(ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs)
Grid1.EditIndex = -1 ‘set to no selection
Grid1.DataBind()
End Sub
Sub Grid1_Update(ByVal Sender As Object, ByVal E As System.Web.UI.WebControls.GridViewUpdateEventArgs)
Dim name As TextBox
Dim str As String = Grid1.Rows(E.RowIndex).Cells(1).Text
‘Dim image As FileUpload
name = CType(Grid1.Rows(E.RowIndex).Cells(0).Controls(0), TextBox)
Dim con As New System.Data.SqlClient.SqlConnection
Dim param As Data.SqlClient.SqlParameter
con.ConnectionString = “Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\chocobar.mdf;Integrated Security=True;User Instance=True”
Dim myCommand As New System.Data.SqlClient.SqlCommand
Dim cid As Integer = Grid1.DataKeys(E.RowIndex).Value
Response.Write(name.Text)
param = New Data.SqlClient.SqlParameter(“@name”, Data.SqlDbType.NVarChar)
param.Value = name.Text
myCommand.Parameters.Add(param)
myCommand.Connection = con
myCommand.CommandText = “UPDATE Category SET cat_name=@name WHERE cat_id=” & cid
Try
con.Open()
myCommand.ExecuteNonQuery()
Grid1.EditIndex = -1
Response.Write(“Category updated”)
con.Close()
Grid1.DataBind()
Catch
Response.Write(“Category not updated”)
End Try
End Sub
End Class
Pls help me.. I got deadline nearer.. Thanks in advance…
Comment by Naveen | April 17, 2009 |
Test it is very usefull
Comment by Murali | April 21, 2009 |
Just what I was looking for – Thanks.
Comment by Eamonn | June 4, 2009 |
I don’t find this example so dynamic…
You are creating a GridView with three, hard coded, bound columns. Or, am I missing something?
In my code I need to populate the GridView by autogenerating the columns. The update should then handle the situation whether there are 2 or 100 columns. Is this possible?
Comment by henrico | August 27, 2009 |
Henrico –
You’re sort of right. It is not dynamic in the respect that the columns are hard-coded, yes, but it is dynamic in the respect that it’s not hard-bound to a datasource. If you need a TRULY dynamic GV, you can either turn on “autogeneratecolumns=true” or you can add columns at run-time. Something like “Gridview1.Columns.Add([your DataControlField object])” for each column in whatever datatable you have (do a “DataTable.Columns.Count” and then add as many rows as there are columns in your underlying datatable).
Anyways, hope this helps, and thanks for your comment!
-Jason
Comment by Some.Net(Guy) | August 27, 2009 |
Thanks for your quick reply!
I am using “AutoGenerateColumns=True”. The tricky part is how to do the Update since the database table design is vertical… Which now made me realize the impossible task to do a normal Update in GridView. Hmm, maybe a stored procedure will do the job, constructing the update command on-the-fly. I’ll try that! Thanks for your time.
Comment by henrico | August 27, 2009 |
this post was super helpful. It kept me from spending too much time on the wrong path. Important to remember that when the appearance of the control changes, you have to do something different in how you access it in the controls collection for a cell.
Comment by grant | December 28, 2009 |
Grant –
Glad I could help!
Comment by Some.Net(Guy) | December 28, 2009 |
You rock, dude! After hours of searching, this article gave me the solution to the double click issue I was having.
Thanks.
Comment by Matt | January 27, 2010 |
thanks for the great work.but i couldn’t get the value textbox. the textbox.text value get epty.i need to get new vale that i changed in cell. bellow have the code sample
thank you
Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand
If e.CommandName.Equals(“Update”) Then
Dim subtotal As TextBox
subtotal = CType(GridView1.Rows(index).Cells(6).Controls(0), TextBox)
Comment by Shashi | February 17, 2010 |
hi i am chhaya thanks u
Comment by chhaya | March 4, 2010 |
Thank you, I had doubts about extracting a specific row from a GridView, but you helped me with : “The RowUpdating event is where it gets tricky, since pulling values is not necessarily intuitive. You can’t do something like GridView1(i)(j).Text = str or anything even close. Instead, you must cast the cells as controls.”
Thanks !
Comment by Rui | March 19, 2010 |
Hi,
Thanks a lot for this article. Its very simple and really helpful.
But when clicking the update button exception arises.
So i put breakpoint in GridView2_RowUpdating.
When the control hits the GridView2_RowUpdating the database get updated, everything works fine, but after that the control again goes to GridView2_RowUpdating and exception arises. Hope you will help me to solve this issue.
Below is my code:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
PopulateGrid2()
End If
End Sub
Protected Sub GridView2_RowCancelingEdit(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles GridView2.RowCancelingEdit
GridView2.EditIndex = -1 ‘set to no selection
PopulateGrid2()
End Sub
Protected Sub GridView2_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridView2.RowEditing
GridView2.EditIndex = e.NewEditIndex
PopulateGrid2()
End Sub
Protected Sub GridView2_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView2.RowUpdating
id = GridView2.DataKeys(e.RowIndex).Value
GdPname = CType(GridView2.Rows(e.RowIndex).Cells(0).Controls(0), TextBox)
GdPSize = CType(GridView2.Rows(e.RowIndex).Cells(1).Controls(0), TextBox)
GDPunitPrice = CType(GridView2.Rows(e.RowIndex).Cells(2).Controls(0), TextBox)
Try
Product_update()
GridView2.EditIndex = -1 ‘set to no selection
PopulateGrid2()
lblSuccess.Text = “That product is updated successfully”
Catch ex As Exception
lblError.Text = ex.Message
End Try
End Sub
Private Sub Product_update()
Dim Str As String
Dim sqlCon As SqlConnection = New SqlConnection(strCon)
Str = “update ProductList set ProductName='” & GdPname.Text & “‘,ProductSize='” & GdPSize.Text & “‘,UnitPrice=” & GDPunitPrice.Text & “where ProductID=” & id
Dim sqlCmd As SqlCommand = New SqlCommand(Str, sqlCon)
sqlCon.Open()
sqlCmd.ExecuteNonQuery()
sqlCon.Close()
End Sub
Private Sub PopulateGrid2()
Dim dbCon As SqlConnection = New SqlConnection(strCon)
dbCon.Open()
Try
Dim cmd As SqlCommand = New SqlCommand(“select ProductId,ProductName,ProductSize,OpeningStockLevel,ClosingStockLevel,convert(decimal(15,2),UnitPrice) as UnitPrice,QtyRejected,Units from ProductList order by ProductName”, dbCon)
Dim da As SqlDataAdapter = New SqlDataAdapter(cmd)
Dim dt As DataTable = New DataTable
da.Fill(dt)
GridView2.DataSource = dt
GridView2.DataBind()
Catch ex As Exception
Throw ex
Finally
dbCon.Close()
End Try
End Sub
Comment by Jasna | April 27, 2010 |
in my program, all the events GridView2_RowEditing,GridView2_RowCancellingEdit,GridView2_RowUpdating are fired twice.
GridView2_RowUpdating is executing second time exception arises
ArgumentOutOfRangeException was handled by user code. Specified argument was out of range of valid values, Parameter name: index
Is this correct or is there anything wrong in my program
Pls do help me to sort it out
Comment by Jasna | April 27, 2010 |
What is your .aspx?
Comment by Some.Net(Guy) | April 27, 2010 |
Comment by Jasna | April 28, 2010
hello frnds i am trying update my total gridview by cliking on update button but am getting the error
“Unable to cast object of type ‘System.Web.UI.LiteralControl’ to type ‘System.Web.UI.WebControls.TextBox’. ”
updatebutton code
—————-
{
SqlConnection con = new SqlConnection(“Data Source=DEVWR1\\DEVWR1SQL05;Initial Catalog=swetha;Integrated Security=True”);
SqlDataAdapter da = new SqlDataAdapter(“update add_mdfy set name='” + ((TextBox)GridView2.Rows[e.RowIndex].Cells[4].Controls[0]).Text + “‘, occupation='” + ((TextBox)GridView2.Rows[e.RowIndex].Cells[5].Controls[0]).Text + “‘, phoneno=” + ((TextBox)GridView2.Rows[e.RowIndex].Cells[6].Controls[0]).Text + “,age=” + ((TextBox)GridView2.Rows[e.RowIndex].Cells[7].Controls[0]).Text + ” where property =” + ((TextBox)GridView2.Rows[e.RowIndex].Cells[1].Controls[0]).Text, con);
DataSet ds = new DataSet();
da.Fill(ds);
GridView2.DataSource = ds;
}
source code
————
<asp:TextBox ID="tb1" Visible='’ Text=” runat=”server”>
<asp:TextBox ID="tb2" Visible='’ Text=” runat=”server”>
<asp:TextBox ID="tb3" Visible='’ Text=” runat=”server”>
<asp:TextBox ID="tb4" Visible='’ Text=” runat=”server”>
Comment by swetha | May 4, 2010 |
source code
———-
<asp:TextBox ID="tb1" Visible='’ Text=” runat=”server”>
<asp:TextBox ID="tb2" Visible='’ Text=” runat=”server”>
<asp:TextBox ID="tb3" Visible='’ Text=” runat=”server”>
<asp:TextBox ID="tb4" Visible='’ Text=” runat=”server”>
Comment by swetha | May 4, 2010 |
sorce code
———
i used the itemtemplet for creating tha name,occupation,phoneno,age by spicifing the textbox names
as tb,tb2,tb3,tb4 and property is boundfield and in dont have any primarykeys in this application.
Comment by swetha | May 4, 2010 |
please provide the code in C# to update a row value by increasing 1 in a grid view on button click of that particulatr row
Comment by harsh chhajer | May 18, 2010 |
i just to say that when using asp.net as a web builder the most stricking feature of asp.net is a session, cookies, databinding, and database handling and so on…………
i meant to say is that when u insert the values in to the database whats is the purpose to handle these values into the database and in which way to handle the database values ok……… u r saying that by firing the query in to the database but i think thats not enough for the other learners just think that when using the concept the concept of databinding all the controls thats are related to the binding are fetch from the controls property but i says when u pooling the database into the other is not the proper way to handle and tell me sumthing abt the querystring i knw there are querybuilder, queryadapter, i knw but i says some feature of ado.net has not been mentioned here to describe the database properly. just try to understand wat i meant to say………………………
another problem i have to learning during website is that all the learners is that asp.nert is a server scripting language…………and not at allllllllllllll…………..ok………….
your student
a.m. pettewar
Comment by ashish | July 6, 2010 |
You saved me many more nights of stress tyring to update a gridview programatically. I was struggling with the
“You can’t do something like GridView1(i)(j).Text = str or anything even close.” part of it. Trying every way under the sun to reliably get values from the gridview cells. I even tried e.newvalues. Didnt work so well. I would have never thought to cast them to another type! Thanks a million!!
Comment by attrib | August 2, 2010 |
[…] http://dotnetdiscussion.net/2007/09/26/aspnet-gridview-updateeditcancel-hyperlinkfields-and-datakey-… Filed under ASP.NET Code ← My Favorite Places to learn about RDF/Semantic Web, ETC […]
Pingback by Manually editing and updating a gridview control with a dynamic data source in ASP.NET « Patgoode's Blog | August 15, 2010 |
i’ve always found the easiest way to extract and update the data is to use templates… you can convert a read only cell into a textbox that way… from there, you can ctype the control using it’s id and reference it that way…
you can then call a sqldatasource.update() command to update the database
Comment by andrew | August 21, 2010 |
Thanks for your insightful topic.
Comment by Chris Henning | February 12, 2012 |