gridview update (find control)

I have place an edit/update button on my gridview and I am using the following code to pickup any changes upon editting/updating.

Location_Type = ((TextBox)user_records.Rows[e.RowIndex].FindControl("LocationTypetb")).Text;

The problem is  the code does not read the changes made to the content of the gridview, rather it returns the gridview orginal values.

Mr_ShawAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Juan_BarreraCommented:
Hi,
You should place you code in the gridview's RowEditing or RowUpdating event handlers, which have an e parameter of type GridViewEditEventArgs or GridViewUpdateEventArgs, respectively.
Acessing e properties will give you the old and new values.
0
Mr_ShawAuthor Commented:
at the moment it is located in GridViewUpdate
0
Refael AckermannCommented:
You seem to be using a valid approach, but remember that if you are doing a data re-bind then you new values are overwritten with the old values.
Make sure you have the if(IsPostback) clause.

if (!IsPostback)
{
  // Do the Databind dance...
}

Open in new window

0
Cloud Class® Course: CompTIA Cloud+

The CompTIA Cloud+ Basic training course will teach you about cloud concepts and models, data storage, networking, and network infrastructure.

Juan_BarreraCommented:
Sorry, but there is no such event handler in a grid view. Can you please recheck?
0
Mr_ShawAuthor Commented:
ok I have changed my code to this

    protected void edit_record_updating(object sender, GridViewUpdateEventArgs e)
    {

        update_records_method.Record_ID = ((TextBox)user_records.Rows[e.RowIndex].FindControl("RecordIDtb")).Text.ToString();
        update_records_method.Logon_Name = WindowsIdentity.GetCurrent().Name.ToString();
        update_records_method.Record_Class = ((TextBox)user_records.Rows[e.RowIndex].FindControl("RecordClasstb")).Text.ToString();

  if (!Page.IsPostBack)
        {
         BindData();   // Do the Databind dance...
        }

}

Is this correct
0
Refael AckermannCommented:
Not excatly, what I ment.
You need to do this ONLY If you already have Data Binding in any of the previous Event handlers (Page_Init or Page_Load), similar to:

protected void Page_Load(object sender, EventArgs e)
{
  if (!Page.IsPostBack)
  {
    BindData();   // Do the Databind dance...
  }
}

Open in new window

0
Juan_BarreraCommented:
If all these TextBoxes are part of the row you are updating, you should get the new values from the e parameter of the method (the e.NewValues collection). There is no need to find the controls.
Just have a look at what's returned by "e", and you'll see what I mean.
Also, there is no need to call BindData there.
0
Mr_ShawAuthor Commented:
Ok, what i have done is put

if i use e.NewValues  how do i distinguish between the many textboxes in gridview edit.
0
Juan_BarreraCommented:
Have a look at this link, it might be useful: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridviewupdateeventargs.newvalues.aspx
But, in short, you can get them by index or by key, for example, :
update_records_method.Record_ID = e.NewValues(index_of_the_column_containing_the_record_id).ToString
0
Mr_ShawAuthor Commented:
I used the following code

string test = e.NewValues[3].ToString();

i got the following error.

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

I also used the approach stated in the link ; foreach (DictionaryEntry.........I put a break point on the foreach loop, but the code just skipped through this section.
0
Juan_BarreraCommented:
Mmm..so what's the lenght of the NewValues collection (e.NewValues.Count)?
If it's 0, then there is something wrong with the update logic. How are you dataBinding the grid? If you try your code in the GridViewUpdated event, is the e.NewValue collection empty  as well?
0
Mr_ShawAuthor Commented:
Ahhhhhhhhhhhhhh e.NewValues.Count was equal to 0.

I am binding the grid using

        user_records.DataSource = users;
        user_records.DataBind();
0
Juan_BarreraCommented:
And if you try your code in the GridViewUpdated event, is the e.NewValue collection empty as well?
0
Mr_ShawAuthor Commented:
i put the code in GridViewUpdated and applied a break point. However, the code did not pass through the GridViewUpdated event.
0
Juan_BarreraCommented:
but did you set GridViewUpdated as a handler? , like:
 

<asp:GridView ID="GridView1" runat="server" OnRowUpdated="GridViewUpdated" moreProperties......>
        </asp:GridView>

Open in new window

0
Mr_ShawAuthor Commented:
I have set all the handlers


        <asp:GridView ID="user_records" runat="server" 
            onprerender="edit_record_PreRender" 
            onrowcancelingedit="edit_record_RowCancelingEdit" 
            onrowdeleted="edit_record_RowDeleted" onrowdeleting="edit_record_RowDeleting" 
            onrowediting="edit_record"  
            onrowupdating="edit_record_updating" 
            OnRowUpdated="edit_record_updated"
            onselectedindexchanged="edit_record_SelectedIndexChanged" 
            onselectedindexchanging="edit_record_SelectedIndexChanging" 
            onsorted="edit_record_Sorted" onsorting="edit_record_Sorting" 
            onrowdatabound="edit_record_RowDataBound">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
                <asp:CommandField ShowDeleteButton="True" />

Open in new window

0
Juan_BarreraCommented:
Can you please then post you markup and the code-behind for the edit / update events?
0
Mr_ShawAuthor Commented:
here is my code
    protected void edit_record(object sender, GridViewEditEventArgs e)
    {
 
        user_records.EditIndex = e.NewEditIndex;
        BindData(); 
        
    }
 
 
    protected void edit_record_updated(object sender, GridViewUpdatedEventArgs e)
    {
        Response.Write(e.NewValues.Count.ToString() + " updated");
     }
    protected void edit_record_updating(object sender, GridViewUpdateEventArgs e)
    {
 
       Response.Write( e.NewValues.Count.ToString() + " update");
 
 
    }

Open in new window

0
Juan_BarreraCommented:
But, if that worked, is going to give you the number of cells updated, is that what you want?

I'm now a bit confused about how this relates with the original question. If there is anything you can provide us to clarify, it would be appreciated.
0
Mr_ShawAuthor Commented:
It does not work. When I update the values in the gridview, the updated values are not picked up by the code.

I have used break point to test my code and the same thing happens every time, the code just does not recognise that I have changed a value.
0
Juan_BarreraCommented:
All right, so: How are you binding the grid? I can't see it in the markup you posted. Is it in code behind? Can you please post it?

0
Mr_ShawAuthor Commented:
in page load i use the following      


      user_records.DataSource = users;
            user_records.DataBind();


0
Juan_BarreraCommented:
do you check for post back?

if (!IsPostback)
{
            user_records.DataSource = users;
            user_records.DataBind();
}
0
Mr_ShawAuthor Commented:
I chanegd my code to read

if (!Page.IsPostBack)
            {
                user_records.DataSource = users;
                user_records.DataBind();
            }

now i can't get rid of the update button.
0
Juan_BarreraCommented:
Sorry, but I mean to say that you should bind the gridview upon every post-back.
As you are not using DataSourceID, you should create code to do this.

I'll leave you to find out how to do this, it's just a matter of going through the MSDN documentation.

Anyway, now you know in what events and in what parameter you'll find you old / new values.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Mr_ShawAuthor Commented:
I am still in the same situtaion as before. I know what events do what.

I don't understand why i need to give a datasourceID
0
Mr_ShawAuthor Commented:
0
Mr_ShawAuthor Commented:
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
.NET Programming

From novice to tech pro — start learning today.

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.