Button to update row in gridview

I am new to asp.net and I am hoping you can help with a question on gridview controls.   I have a gridview control that shows a list of transactions.   I have added two buttons (Approve/Rescind) to the gridview that I would like to update a field on the record.   There is a SQL data source that is attached to the gridview control and I have created two separate SQL data sources with the appropriate update statements for the updating the field.  I have assigned the buttons with CommandName attributes of "Approve" and "Rescind" respectively.   A couple of questions...

1.  There is a transaction ID in the select statement used by the gridview.   It is the primary key for the table and I would need to use this for my update statement.  How do I get the transaction id associated with the buttons on a given row?  

2.  How would I initiate the update (assume this is done in the C# code)?

Thank you!
John
jzlamalAsked:
Who is Participating?
 
Tom BeckConnect With a Mentor Commented:
The asp:Button would need to be inside an asp:TemplateField.

         <asp:TemplateField>
            <ItemTemplate>                
                <asp:Button ID="btnTest" Text="Approve" runat="server" CommandName="Approve" CommandArgument='<%# Bind("transactionid") %>' OnCommand="btnTest_Command" />
            </ItemTemplate>
        </asp:TemplateField>
0
 
BuggyCoderCommented:
0
 
Tom BeckCommented:
How do I get the transaction id associated with the buttons on a given row?  

Add a CommandArgument attribute to the button to hold the transaction ID.

<asp:Button ID="btnTest" Text="Approve" runat="server" CommandName="Approve" CommandArgument='<%# Bind("transactionid") %>' OnCommand="btnTest_Command" />

Handle the update on the button click, retrieve the transaction id from the CommandArgument.
protected void btnTest_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandName == "Approve")
            {
                string transactionId = (string)e.CommandArgument;
                //Update the database
            }
        }

Open in new window

0
Cloud Class® Course: Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

 
jzlamalAuthor Commented:
I tried your suggestion and I received the following...

System.Web.UI.WebControls.DataControlFieldCollection must have items of type 'System.Web.UI.WebControls.DataControlField'. 'asp:Button' is of type 'System.Web.UI.WebControls.Button'

Is the Button field you provided appropriate for adding inside a gridview control or do I need to use something else?

Thanks!
john
0
 
jzlamalAuthor Commented:
Ok.  So the transaction ID is being passed when I click on the button.   However, it is not being passed along to the update statement.   In the btnTest_Command, I am calling the Update method of the SQL Datasource using "UpdApprove.Update()".   I have a SQL Data source defined as:

<asp:SqlDataSource ID="UpdApprove" runat="server"
        ConnectionString="<%$ ConnectionStrings:PMMARTConnectionString %>"
        UpdateCommand="UPDATE [TT_TRANS] SET [ApprovedFlag] = 'Y', [ApprDate] = getdate() WHERE [TranID] = @TranID">
        <UpdateParameters>
            <asp:Parameter Name="TranID" Type="String" />
        </UpdateParameters>
    </asp:SqlDataSource>

Do I need to do anything else to pass the transactionID from the btnTest_Command to the SQLDataSource?   Even though the button is getting the correct transaction id, it doesn't seem to be passing it along to the update statement.  Thanks!
0
 
jzlamalAuthor Commented:
Once I added a line to update the UpdateParameter, everything worked.   Thank you so much!
0
 
Tom BeckCommented:
You are revealing new circumstances that were not part of your original question. The method I presented assumed that you were manually updating your database. If you are using all the built-in mechanisms for populating/updating a Gridview then disregard my suggestion. There are multiple ways to do this. You could specify an OnRowUpdating event in your GridView markup.

<asp:GridView ID="GridView1" OnRowUpdating="GridView1_RowUpdating"....

You could add DataKeyNames to get the transaction ids.

...DataKeyNames="transactionid" >

Then in the <columns> block you could include a command field.

<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />

When a user clicks the Edit link, in code behind, switch to Update mode.
protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            GridView1.EditIndex = e.NewEditIndex; // turn to edit mode
            BindGridView(); // Rebind GridView to show the data in edit mode
        }

Open in new window


This should change your BoundFields to textboxes and the Edit/Delete link to Update/Cancel.

User makes changes and clicks Update link

Then in the RowUpdating event.
protected void gridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
             string transactionId = (string)GridView1.DataKeys[0].Value;
             //Use the DataKey as the Update statement parameter
        }

Open in new window


But, like I said, there are many possibilities.
0
 
Tom BeckCommented:
Our posts crossed. Thanks for the points. Glad to help.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.