I have a problem with my UPDATE functions and I need your help.
I created a table Computers(COM_ID,Company,Price,Model,Description,CAT_ID,Image,Quantity)
I have a web service(AdminCentral.asmx) with this code
[WebMethod(Description = "Updates a computer in the computer table", EnableSession = false)]
public string updateItem(string comid, string company, double price, string model, string description, string image, int CAT_ID, int quantity)
{
try
{
dbConn = new DbConnection();
SqlConnection conn = dbConn.OpenConnection();
SqlCommand updateItem = new SqlCommand("UpdateComputer", conn);
updateItem.CommandType = CommandType.StoredProcedure;
SqlParameter updatecomid = updateItem.Parameters.Add("@COM_ID", SqlDbType.Char, 15);
updatecomid.Value = comid;
SqlParameter updateCompany = updateItem.Parameters.Add("@Company", SqlDbType.Char, 90);
updateCompany.Value = company;
SqlParameter updatePrice = updateItem.Parameters.Add("@Price", SqlDbType.Money, 8);
updatePrice.Value = price;
SqlParameter updateModel = updateItem.Parameters.Add("@Model", SqlDbType.Char, 150);
updateModel.Value = model;
SqlParameter updateDescription = updateItem.Parameters.Add("@Description", SqlDbType.Char, 255);
updateDescription.Value = description;
SqlParameter updateImage = updateItem.Parameters.Add("@Image", SqlDbType.Char, 50);
updateImage.Value = image;
SqlParameter updateCatId = updateItem.Parameters.Add("@CAT_ID", SqlDbType.Int, 2);
updateCatId.Value = CAT_ID;
SqlParameter updateQuantity = updateItem.Parameters.Add("@Quantity", SqlDbType.Int, 2);
updateQuantity.Value = quantity;
return this.ExecuteQuery(updateItem);
}
catch (Exception e)
{
return e.ToString();
}
}
In a different application I created the web reference and I have this Datagrid
<asp:datagrid id="Computerchange" runat="server" AllowPaging="True" PageSize="2" AutoGenerateColumns="False" BorderColor="Gainsboro" Height="500px"
<Columns>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" HeaderText="Admin Functions" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
<asp:ButtonColumn Text="Delete" HeaderText="Delete" CommandName="Delete"></asp:ButtonColumn>
<asp:BoundColumn DataField="com_id" ReadOnly="True" HeaderText="Computer Number"></asp:BoundColumn>
<asp:BoundColumn DataField="company" HeaderText="Company"></asp:BoundColumn>
<asp:BoundColumn DataField="price" HeaderText="Price"></asp:BoundColumn>
<asp:BoundColumn DataField="model" HeaderText="Model"></asp:BoundColumn>
<asp:BoundColumn DataField="description" HeaderText="Description"></asp:BoundColumn>
<asp:BoundColumn DataField="id" ReadOnly="True" HeaderText="Category"></asp:BoundColumn>
<asp:BoundColumn DataField="imgSrc" HeaderText="Image"></asp:BoundColumn>
<asp:BoundColumn DataField="quantity" ReadOnly="True" HeaderText="Quantity"></asp:BoundColumn>
</Columns>
</asp:datagrid>
and I wrote this function
private void Computerchange_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//Store updated column values in local variables:
string updateCOM_ID = e.Item.Cells[2].Text;
string updateCompany = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
double updatePrice = double.Parse(((TextBox)e.Item.Cells[4].Controls[0]).Text);
string updateModel = ((TextBox)e.Item.Cells[5].Controls[0]).Text;
string updateDescription = ((TextBox)e.Item.Cells[6].Controls[0]).Text;
int updateCategoryId = int.Parse(e.Item.Cells[7].Text);
string updateImage = ((TextBox)e.Item.Cells[8].Controls[0]).Text;
int updateQuantity = int.Parse(e.Item.Cells[9].Text);
newView.RowFilter = "com_id='" + updateCOM_ID + "'";
if (newView.Count > 0)
{
//Delete the row that is being updated
newView.Delete(0);
}
newView.RowFilter = "";
//Create a new DataRow and populate it with the new data.
DataRow Row = Table.NewRow();
Row["com_id"] = updateCOM_ID;
Row["company"] = updateCompany;
Row["price"] = updatePrice;
Row["model"] = updateModel;
Row["description"] = updateDescription;
Row["id"] = updateCategoryId;
Row["imgSrc"] = updateImage;
Row["quantity"] = updateQuantity;
//Insert the new DataRow:
Table.Rows.Add(Row);
Computerchange.EditItemIndex = -1;
Computerchange.DataSource = newView;
Computerchange.DataBind();
// Now update the database with the new data
adminCentral1.adminCentral newData = new adminCentral1.adminCentral();
string results;
results = newData.updateItem(updateCOM_ID, updateCompany, updatePrice, updateModel, updateDescription, updateImage, updateCategoryId, updateQuantity);
if (results == "Success")
{
errorLabel.Text = "Computer Updated to database!";
}
else
{
errorLabel.Text = results;
}
When I click the Update button the error which I have is
"**Specified argument was out of the range of valid values.
Parameter name: index**"
Stack Trace:
[ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index]
System.Web.UI.ControlCollection.get_Item(Int32 index) +8750274
AdminMainPage.Computerchange_UpdateCommand(Object source, DataGridCommandEventArgs e) +626
System.Web.UI.WebControls.DataGrid.OnUpdateCommand(DataGridCommandEventArgs e) +115
System.Web.UI.WebControls.DataGrid.OnBubbleEvent(Object source, EventArgs e) +498
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.DataGridItem.OnBubbleEvent(Object source, EventArgs e) +121
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +125
System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +169
System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +9
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +176
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
Can you please help me with this error? I would like to mention that first, I didn’t have the Quantity column and the code was working. When I inserted the Quantity column then I had this error. I think that I am trying to access a control which is not created or not exist in the collection.
The
Specified argument was out of the range of valid values."Parameter name: index*means you tried to access collection outside its rangeThe top two lines of stacktrace are
This means in the method
Computerchange_UpdateCommandyou’re accessing the Control Collection by an index that doesn’t exist.Unfortunatly you reference the control several times, any of the following could be the problem
However this is the most likely candidate.
I suggest you put a breakpoint on the first one and step through and see which one is failing.