Datagrid - OnItemCommand Question

Posted on 2005-04-05
Last Modified: 2012-06-27
Ok Experts here is another datagrid question..

Have a datagrid with 3 columns, 2 bound and 1 a button column.  When the user clicks the button column I want to grab the row data from the first 2 columns and perform an update to a db.  I have the following questions:

1. How do I get the data from the first 2 columns of the row where the button is pressed?
2. In order to trigger an OnItemCommand must the data grid be binded in the page_load?  If I bind the data in the page_load I can display a generic message to the screen when the button is pressed, however if I bind the data in the Page_PreRender the generic message is no longer displayed when the button is pressed.  (Just using the generic message for testing, eventually this is where the call to the db procedure would go...)  Reason why I had the dg bind in the prerender is because the datagrid values were dependent upon a value the user selected in a dropdownlist of the header which posts back to the current page.  If I keep the bind in the pageload the data is always 1 postback behind b/c as I understand it the page_load is executed prior to the dropdown_selectedIndexChange.

<ASP:DataGrid id="MyDataGrid" runat="server"
    Font-Name="Verdana" Height="16px" BorderWidth="2"
    HeaderStyle-BackColor="#999999" HeaderStyle-Height="16px" HeaderStyle-Font-Size="11px"

      HeaderText="First Name"
      ItemStyle-HorizontalAlign="Center" />

      HeaderText="Last Name"
      HeaderStyle-HorizontalAlign="Center" />

<asp:ButtonColumn CommandName="Delete" Text ="<img border=0 src=../images/icons/trash-24.png>">
      <ItemStyle HorizontalAlign="Center"></ItemStyle>


Sub dgrdItemCommand( s As Object, e As DataGridCommandEventArgs )
  'where I would get the 2 bound values & call the procedure

                If e.CommandName="Delete" Then
            lblOutput.Text = "You clicked one of the delete buttons!"
            lblOutput.Text = "Error"
      End If
               End Sub
Question by:egdigital
    LVL 4

    Expert Comment

    This was a good question, and I wanted to find out the answer to this by myself as well.  What I found was:

    use a disconnected recordset (set rs.activeconnection = nothing)

    Posted by emoreau at:

    This following code was found at:


    Dim objTable as Table
    objTable = CType(dgCustomers.Controls(0),Table)
    'Ignore Header Row and Footer Row
    for i = 1 to objTables.Rows.Count - 2

    'txtName declared as TextBox Server Control
    'inside the Template Column within the DataGrid in the ASPX Page

    txtName = (objTables.Rows(i).FindControl("txtName"),TextBox)
    Write Update Code


    Table objTable;
    objTable = (Table)(dgCustomers.Controls(0)
    //Ignore Header Row and Footer Row
    for(i=1;i<Count - 1;i++)
    //txtName declared as TextBox Server Control inside
    //the Template Column within the DataGrid in the ASPX Page
    txtName = (TextBox)(objTables.Rows(i).FindControl("txtName");

    Write Update Code

    Hope this helps!

    Author Comment

    Thanks, Kittrick. Could you explain the disconnected recordset a little, in the code below (VB preferred) it looks as though I would be looping through all of the records that are in the table.  I don't understand how to use the disconnected recordset so I can identify the particular row where the button what pressed.
    LVL 1

    Accepted Solution

     I think I can clear this up for you first a quick explanation. I will give a quick explaination and then code example. I am posting my sample in c# if you need me to help you translate it let me know. You basically want to follow these steps;
    1. bind your grid with default data on page load if not page.IsPostBack
    2. you do not need to bind in the pre render.
    3. set your dropdown list to trigger a postback and in its SelectedIndexChanged event determine your data based on the user selection and then rebind the data to the datagrid.

    That should help with #2.

    as for #1 just refer to the cells text in the DataGridCommandEvent i.e. e.Item.Cells[0].Text

                    private void Page_Load(object sender, System.EventArgs e) {
                      if(!Page.IsPostBack) {

                private void bindTableToSelectedData(string selected) {
                      switch(selected) {
                            case  "badguy":
                                  MyDataGrid.DataSource = badGuyDataSouce;
                            default: //goodguy
                                  MyDataGrid.DataSource = goodGuyDataSouce;

                #region Web Form Designer generated code
                override protected void OnInit(EventArgs e)
                      // CODEGEN: This call is required by the ASP.NET Web Form Designer.
                /// <summary>
                /// Required method for Designer support - do not modify
                /// the contents of this method with the code editor.
                /// </summary>
                private void InitializeComponent()
                      this.DropDownList1.SelectedIndexChanged += new System.EventHandler(this.DropDownList1_SelectedIndexChanged);
                      this.Load += new System.EventHandler(this.Page_Load);


                protected void dgrdItemCommand( Object s, DataGridCommandEventArgs e) {
                      //where I would get the 2 bound values & call the procedure
                      if( e.CommandName=="Delete") {
                            string item1 = e.Item.Cells[0].Text;
                            string item2 = e.Item.Cells[1].Text;
                            lblOutput.Text = "You clicked to delete "+item1+" "+item2+"!";
                      else {
                            lblOutput.Text = "Error";

                private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) {

    Hope it helps, let me know if you need furthur clarification.
    LVL 1

    Expert Comment

    By the way I added the init region so that you could see the wireup for the dropdownlist eventhandler. This is only if you wan the dropdown to trigger the event automatically. ( you also have to set AutoPostBack="True" in the control properties). If you want to handle this in a button click just refer to DropDownList1.SelectedValue to determine your data for binding.
    LVL 4

    Assisted Solution

    Hi again,
    Paul Wilson gave a great explanation of disconnected recordsets at:

    "ADO.NET can also create both connected or disconnected "recordsets". DataSets get the majority of the attention in ADO.NET -- think of these as disconnected recordsets. Windows client applications should usually be using the DataSet, and some other types of apps may also depending on what they need. DataReaders are the other type of "recordset" in ADO.NET -- think of these as connected recordsets. In particular, DataReaders are always "firehose" cursors, which means read-only and forward-only. I am not aware of any ways to get the other types of connected recordsets that were available in ADO, but this is by design since it is almost always a good thing. Most ASP.NET applications, or other server-based applications, should probably use DataReaders, although you must still make sure they get closed.

    Note that I use DataReaders only on my sites, since they are efficient and meet my needs. DataSets are just another layer of overhead that are actually filled internally by a DataReader, so why use them if you don't need them. I use some page and data caching on my sites, but a good use of the DataSet on some ASP.NET sites would be for direct caching of the "recordset". Hopefully this makes some of the choices in ADO.NET more clear, but every situation is different so you should do more reading. By the way, your answer is that NO -- DataSets are disconnected and will not reflect data changes without doing some type of refresh. You can still have any updates that are pushed back check for changes and throw exceptions or otherwise handle any data changes. "

    As for code, a simple example would be (I used a datalist, but you can change DataListCommandEventArgs to DataGridCommandEventArgs):

    <<<<<<<<<<<<<START CODE-BEHIND>>>>>>>>>>>>>>
    Public Sub OnUpdate(ByVal Source As Object,ByVal e As DataListCommandEventArgs)

    'field1 is a number
    Dim field1_ As String = CTYPE(e.Item.FindControl(" field1"),TextBox).Text
    'field2 is text
    Dim field2_ As String = CTYPE(e.Item.FindControl("field2"),TextBox).Text
    'field3 is a date
    Dim field3 As String = CTYPE(e.Item.FindControl("field3"),TextBox).Text
    'unique_identifier is a number
    Dim unique_identifier_ As String = CTYPE(e.Item.FindControl(" unique_identifier"),TextBox).Text

    'opening connection
    Dim oleConn As New OleDB.oleDbConnection()
    'setting the path to the database
    oleConn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;data source=" & server.mappath("\path\toyourDB")
    'setting new command object
    Dim oleComm AS NEW OleDb.oleDbCommand()
    'setting command object equal to connection object

    Dim SQL as String

    SQL = "Update DB set field1=" & field1_  & ",field2=(' " & field2_ & "')"   & ",field3=#" & field3_ &  "#" & " WHERE unique_identifier= " + unique_identifier_  


    oleComm.CommandText= SQL


    'opening the dataadapter to send the data
    Dim da as New OleDb.OleDbDataAdapter()
    'declaring a new dataset (disconnected recordset)
    Dim ds as New DataSet()
    'setting dataadapter equal to the command object

    'dont run a query

    'declaring the itemselected, and setting it equal to it's index, plus 1 if you don't start counting from 0
    Dim itemselected=(e.item.itemindex+1)

    'show me the index (of record selected)!!
    Response.Write("Record " & itemselected & " was the last record in selected.")  

    'close connection
    end sub

    <<<<<<<<<<<<<END CODE-BEHIND>>>>>>>>>>>>>>

    Hope this helps!

    Write Comment

    Please enter a first name

    Please enter a last name

    We will never share this with anyone.

    Featured Post

    Maximize Your Threat Intelligence Reporting

    Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

    This article discusses the ASP.NET AJAX ModalPopupExtender control. In this article we will show how to use the ModalPopupExtender control, how to display/show/call the ASP.NET AJAX ModalPopupExtender control from javascript, how to show/display/cal…
    In .NET 2.0, Microsoft introduced the Web Site.  This was the default way to create a web Project in Visual Studio 2005.  In Visual Studio 2008, the Web Application has been restored as the default web Project in Visual Studio/.NET 3.x The Web Si…
    In this sixth video of the Xpdf series, we discuss and demonstrate the PDFtoPNG utility, which converts a multi-page PDF file to separate color, grayscale, or monochrome PNG files, creating one PNG file for each page in the PDF. It does this via a c…
    This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor ( If you're looking for how to monitor bandwidth using netflow or packet s…

    759 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

    Need Help in Real-Time?

    Connect with top rated Experts

    10 Experts available now in Live!

    Get 1:1 Help Now