[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 887
  • Last Modified:

How to find the Datarow of a datagrid?

Hi There,
I have a datagrid with 4 columns. I need to update a row. For that, I am doing this..

DataRow[] adrEdit = dsOvertureAccounts.Tables["AllAccountConstraints"].Select("Account='"+dgAllAccountConstraints.DataKeys[e.Item.ItemIndex] + "'");

This is returning an array of datarows. But how do I find out which row to update??

Any suggestions appreciated!!
Thanks
0
jackrock79
Asked:
jackrock79
  • 4
  • 3
  • 2
  • +1
1 Solution
 
raterusCommented:
if your datakey is a unique key, the row you need to update should always be the first one.
0
 
jackrock79Author Commented:
Unfortunately, the datakey is not unique. That is the reason I am getting array of rows for the selection criteria.
Thanks.
0
 
raterusCommented:
Your datakeyfield should be unique, it really serves no purpose if it isn't.  Can you put use another unique field?
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
jackrock79Author Commented:
Yeah that's what I am planning to. Put a invisible column with Rowid number and make it the datakeyfield. But I have to number the RowId. I am thinking how I can automatically assign rowid number to that column. Probably shud do it in the Item databound?
Thanks.
0
 
raterusCommented:
Your data should be presented to the datagrid with a unique key already in place.  Even if you fumbled through what you propsed, you still are probably going to need to update the original database eventually..right?
0
 
jackrock79Author Commented:
Do you know how to dynamically add a new column with row values equal to the rows in the datagrid??
Thanks.
0
 
jnhorstCommented:
Raterus is pointing you in the right direction here.  It will help to know what your data source is (SQL Server? Access?).  If it either SQL or Access, you can have an Auto Numbering field for your unique id.  Make sure your data table also has this column and you are returning it in your Select statement.  Then in your grid, turn AutoGenerateColumns to false, and add each column manually.  If you open the Properties window for the grid, you will see a Columns property with a "..." button.  Click this for a dialog that will allow you to do this.  Add the auto num column first, and set uncheck the Visible check box.  The column will be available as a datakey and as the first Cell in a DataGridItem.Cells collection, but it will not show in the browser.  Then do your Select statement using this value and you wil always get one row in the array.

John
0
 
jackrock79Author Commented:
Hi John And Raterus,
This is what I did..and my dB is Sql Server 2000. It doesnt update the dB(doesnt even call the procedure)

SqlCommand cmdOverture = new SqlCommand("dbo.sp_AgentUIGetAllAccountConstraints",GetConnection("Overture").Connection);
                        cmdOverture.CommandType = CommandType.StoredProcedure;
                        cmdOverture.CommandTimeout=300;

                        adapter.SelectCommand = cmdOverture;
                        adapter.Fill(dsOvertureAccounts, "AllAccountConstraints");

                        //Session["SessionDataSetOvAccounts"]= dsOvertureAccounts;
                        

                        DataTable dt = dsOvertureAccounts.Tables[0];
                        dt.Columns.Add(new DataColumn("Identity",Type.GetType("System.Int32")));
                        int count = dt.Columns.Count;
                        for(int i=0;i<dt.Rows.Count;i++)
                        {
                              dt.Rows[i][count-1]= i+1;
                        }
                                                
                        dgAllAccountConstraints.DataSource = dsOvertureAccounts.Tables[0];
                        
                        Session["SessionDataSetOvAccounts"]= dsOvertureAccounts;
                        
                        DataView ViewOvAccounts = dsOvertureAccounts.Tables[0].DefaultView;
                        Session["SessionDataViewOvAccounts"]= ViewOvAccounts;
                        //dgAccounts.DataSource = dsOverture;
                        //dgAccounts.DataMember = "AccountOverview";
                        dgAllAccountConstraints.DataBind();


And in the Update Command of the datagrid..I am doing this...


private void dgAllAccountConstraints_UpdateCommand(object source, DataGridCommandEventArgs e)
            {
                  DataSet dsOvertureAccounts = (DataSet)Session["SessionDataSetOvAccounts"];
                  SqlCommand cmdUpdate;
                  
                  //dsOvertureAccounts.Tables[0].TableName = "AllAccountConstraints";
                  DataRow[] adrEdit = dsOvertureAccounts.Tables[0].Select("Identity='"+dgAllAccountConstraints.DataKeys[e.Item.ItemIndex] + "'");
                  
                  
                  if(adrEdit.Length > 0)
                  {
                  Label lblEngine = new Label();
                  lblEngine = (Label)(e.Item.Cells[0].FindControl("lblEngine"));
           
                  Label lblAccount = new Label();
                  lblAccount = (Label)(e.Item.Cells[1].FindControl("lblAccount"));
                  adrEdit[0]["Account"] = lblAccount.Text;
                      
                  Label lblConstraint = new Label();
                  lblConstraint = (Label)(e.Item.Cells[2].FindControl("lblConstraint"));
                  adrEdit[0]["Constraint"] = lblConstraint.Text;

                  TextBox txtValue = (TextBox) e.Item.Cells[3].Controls[0];
                  adrEdit[0]["Value"] = txtValue.Text;            

                                    
                  if(lblEngine.Text.ToString() =="Overture")
                        cmdUpdate = new SqlCommand("dbo.sp_AgentUIUpdateAccountConstraints", GetConnection("Overture").Connection);
                  else
                        cmdUpdate = new SqlCommand("dbo.sp_AgentUIUpdateAccountConstraints", GetConnection("Google").Connection);

                  cmdUpdate.CommandType = CommandType.StoredProcedure;

                  cmdUpdate.Parameters.Add("@Account", SqlDbType.VarChar,255,"Acccount");
                  //cmdUpdate.Parameters["@Account"].Value = lblAccount.Text;
                  
                  cmdUpdate.Parameters.Add("@Constraint",SqlDbType.VarChar,255,"Constraint");
                  //cmdUpdate.Parameters["@Constraint"].Value = lblConstraint.Text;


                  cmdUpdate.Parameters.Add("@Value",SqlDbType.Float, 8,"Value");
                  //cmdUpdate.Parameters["@Value"].Value = txtValue.Text;
            
                  adapter = new SqlDataAdapter();

                  adapter.UpdateCommand = cmdUpdate;

                        try

                        {
                              dsOvertureAccounts.Tables["AllAccountConstraints"].TableName = "AllAccountConstraints";
                              dsOvertureAccounts.AcceptChanges();
                              
                              adapter.Update(dsOvertureAccounts, "AllAccountConstraints");
                              
                              dgAllAccountConstraints.EditItemIndex = -1;

                              //dgAllAccountConstraints.DataSource = dsOvertureAccounts;                  
                              DataView ViewOvAccounts = dsOvertureAccounts.Tables["AllAccountConstraints"].DefaultView;
                              Session["SessionDataViewOvAccounts"]= ViewOvAccounts;
                              dgAllAccountConstraints.DataSource = ViewOvAccounts;
                              dgAllAccountConstraints.DataBind();
                              
                              
                        }
//                        catch (DBConcurrencyException ex)
//                        {
//                              string customErrorMessage;
//                              customErrorMessage = "Concurrency violation\n";
//                              customErrorMessage += ex.ToString();                  
//                        }
                        catch (Exception ex)
                        {
                              throw new Exception("Unable to update account constraints", ex);
                        }
                                                
                  }


            
            }


It doesnt update the database. Can you please tell me what could be wrong??

Thanks.


0
 
mmarinovCommented:
Hi jackrock79,

have you tried to just call cmdUpdate.ExecuteNonQuery() method BUT not adapter.Update() method ?
it must be executed

Regards!
B..M
0
 
mmarinovCommented:
Hi jackrock79,

can you explain the B Grade?
Please read this : http://www.experts-exchange.com/Programming/Programming_Languages/Dot_Net/ASP_DOT_NET/help.jsp#hi73

B..M
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 4
  • 3
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now