2011-07-25 16 views
0

私の更新機能に問題があり、私はあなたの助けが必要です。テーブルの新しい列と更新機能の問題

私はこのコード

[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(); 

    } 
} 
とウェブサービス(AdminCentral.asmx)を持つテーブルコンピュータ(COM_ID、会社、価格、モデル、説明、CAT_ID、画像、数量)

を作成

は、異なるアプリケーションでは、私は、Web参照を作成し、私は

<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> 

このデータグリッドを持っており、私は、Updateボタンをクリックすると、私が持っているエラーは、あなたがこのエラーで私を助けてくださいすることができ

"**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 

でこの機能を

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; 
    } 

を書きましたの?私は最初に、私は数量の列を持っていなかったことを言及したいと思いますし、コードが動作していた。数量列を挿入すると、このエラーが発生しました。私は作成されていないか、コレクションに存在しないコントロールにアクセスしようとしていると思います。

+2

長い質問を読むのは難しいです。関連コードのみを投稿してください。 –

+0

私は何かを削除すれば、コードが間違っていることを正確に理解できないかもしれないので、私の質問を詳細に書いた – dali1985

+0

あなたはエラーがあなたに何を伝えているかを正確に知ることができます。配列インデックスを使用している唯一の場所は、グリッド内のセルから値を取り出すときです(例: 'e.Item.Cells [5] .Controls [0]')。コントロールコレクションにインデックスを付けるたびに、nullコントロールがないことを確認します。 –

答えて

2

Specified argument was out of the range of valid values."Parameter name: index*は、あなたがその範囲外のスタックトレースの

トップの2行をコレクションにアクセスしようとした意味)SSMSを経由して(手動でストアドプロシージャを実行することは

System.Web.UI.ControlCollection.get_Item(Int32 index) +8750274 
    AdminMainPage.Computerchange_UpdateCommand(Object source, DataGridCommandEventArgs e) + 

ですこれは、メソッドに意味しますComputerchange_UpdateCommand存在しないインデックスによってコントロールコレクションにアクセスしています。

残念ながらあなたは次のいずれかの問題

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); 

可能性があり、コントロールを数回参照しかし、これは最も可能性の高い候補です。

int updateQuantity = int.Parse(e.Item.Cells[9].Text); 

最初のものにブレークポイントを設定し、ステップスルーして、どちらが失敗しているかを確認することをお勧めします。

+0

最後に数量です。しかし残念ながら、私はそれを修正するために何ができるのか分かりません。 – dali1985

+0

@ theo1985データソースに数量列はありますか?それを表示すると、ASP.NETページに表示されますか? –

+0

はいあります。上記をチェックすると、数量のBoundColumnがあります。また、私はこのフィールドに編集することができます。しかし、私はそれを更新しようとすると、私は毎回このエラーがあります。 – dali1985

0

これは通読するための情報がたくさんある...あなたが行うことができますいくつかのことを狭めるダウンする範囲を少し:

1)あなたのインデックスが範囲外ではないことを確認してください。通常、インデックスは0より小さくはできません。 2)デバッグを使用して実行をステップ実行します。デバッグ中は、インデックス変数の値を追跡します。 3)

0

私には分かりませんが、実際にどのコード行が例外をスローしているのか分かりません。数量を追加した後に例外が表示されたので、このコード行にブレークポイントを置くことをお勧めします。

int updateQuantity = int.Parse(e.Item.Cells[9].Text); 

ブレークポイントのステップオーバーにヒットし、例外をスローする行かどうかを確認します。それはあなたが知っている場合、あなたの細胞は実際には存在しないし、何を修正する必要があるのか​​明確な考えがある。

+0

はい。ここでそれはヒットします。量で。私はそれを修正するために今何を確認できますか? – dali1985