2016-06-27 4 views
3

私は、ユーザーがデータベースと対話するために使用するビジュアルスタジオのフロントエンドを開発しました。唯一の問題は、更新がgridviewから機能しないことです。私は、この問題をソートしようとするために複数の方法を試みました。問題のテーブルの図とグリッドビューのコードを添付しました。誰かが私のエラーを指摘してくれますか?更新ボタンをクリックしたときにフロントエンドアプリケーションからデータベースにコンテンツをプッシュできません

エラーは次のとおりです。

インデックスが範囲外でした。負でなく、コレクションのサイズより小さくなければなりません。 パラメータ名:インデックス

Database table for info read/write

private void BindGrid() 
    { 
     string constr = ConfigurationManager.ConnectionStrings["ZS_CS_EVO_IntegrationConnectionString"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(constr)) 
     { 
      using (SqlCommand cmd = new SqlCommand("SELECT Id, Period_Id, Evo_StockLink, Evo_ItemCode, Evo_Description, UnitRate, MinRate, RateBeforeSevenDays, RateAfterSevenDays FROM rates")) 
      { 
       using (SqlDataAdapter sda = new SqlDataAdapter()) 
       { 
        cmd.Connection = con; 
        sda.SelectCommand = cmd; 
        using (DataTable dt = new DataTable()) 
        { 
         sda.Fill(dt); 
         GridView1.DataSource = dt; 
         GridView1.DataBind(); 
        } 
       } 
      } 
     } 
    } 

    protected void OnRowEditing(object sender, GridViewEditEventArgs e) 
    { 
     GridView1.EditIndex = e.NewEditIndex; 
     this.BindGrid(); 
    } 

    protected void OnRowUpdating(object sender, GridViewUpdateEventArgs e) 
    { 
     GridViewRow row = GridView1.Rows[e.RowIndex]; 
     int Id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]); 
     int Period_Id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]); 
     int Evo_StockLink = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]); 
     string Evo_ItemCode = (row.Cells[3].Controls[0] as TextBox).Text; 
     string Evo_Description = (row.Cells[4].Controls[0] as TextBox).Text; 
     float UnitRate = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]); 
     float MinRate = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]); 
     float RateBeforeSevenDays = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]); 
     float RateAfterSevenDays = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[0]); 
     string constr = ConfigurationManager.ConnectionStrings["ZS_CS_EVO_IntegrationConnectionString"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(constr)) 
     { 
      using (SqlCommand cmd = new SqlCommand("UPDATE rates SET Period_Id = @Period_Id, Evo_StockLink = @Evo_StockLink, Evo_ItemCode = @Evo_ItemCode, Evo_Description = @Evo_Description, UnitRate = @UnitRate, MinRate = @MinRate, RateBeforeSevenDays = @RateBeforeSevenDays, RateAfterSevenDays = @RateAfterSevenDays WHERE Id = @Id")) 
      { 
       cmd.Parameters.AddWithValue("@Id", Id); 
       cmd.Parameters.AddWithValue("@Period_Id", Period_Id); 
       cmd.Parameters.AddWithValue("@Evo_StockLink", Evo_StockLink); 
       cmd.Parameters.AddWithValue("@Evo_ItemCode", Evo_ItemCode); 
       cmd.Parameters.AddWithValue("@Evo_Description", Evo_Description); 
       cmd.Parameters.AddWithValue("@UnitRate", UnitRate); 
       cmd.Parameters.AddWithValue("@MinRate", MinRate); 
       cmd.Parameters.AddWithValue("@RateBeforeSevenDays", RateBeforeSevenDays); 
       cmd.Parameters.AddWithValue("@RateAfterSevenDays", RateAfterSevenDays); 
       cmd.Connection = con; 
       con.Open(); 
       cmd.ExecuteNonQuery(); 
       con.Close(); 
      } 
     } 
     GridView1.EditIndex = -1; 
     this.BindGrid(); 
    } 

ASPX:

<asp:GridView ID="GridView1" runat="server" OnRowEditing="OnRowEditing" OnRowCancelingEdit="OnRowCancelingEdit" OnRowUpdating="OnRowUpdating" AutoGenerateEditButton="True" BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Vertical" PageSize="3"> 
     <AlternatingRowStyle BackColor="#DCDCDC" /> 
     <FooterStyle BackColor="#CCCCCC" ForeColor="Black" /> 
     <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" /> 
     <RowStyle BackColor="#EEEEEE" ForeColor="Black" /> 
     <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" /> 
     <SortedAscendingCellStyle BackColor="#F1F1F1" /> 
     <SortedAscendingHeaderStyle BackColor="#0000A9" /> 
     <SortedDescendingCellStyle BackColor="#CAC9C9" /> 
     <SortedDescendingHeaderStyle BackColor="#000065" /> 
    </asp:GridView> 
    <asp:SqlDataSource ID="RatesLink" runat="server" 
ConnectionString="<%$ ConnectionStrings:ZS_CS_EVO_IntegrationConnectionString %>" 
OldValuesParameterFormatString="original_{0}" SelectCommand="SELECT * FROM [rates]" 
ConflictDetection="CompareAllValues" DeleteCommand="DELETE FROM [rates] WHERE [id] = @original_id AND (([Period_Id] = @original_Period_Id) OR ([Period_Id] IS NULL AND @original_Period_Id IS NULL)) AND [Evo_StockLink] = @original_Evo_StockLink AND [Evo_ItemCode] = @original_Evo_ItemCode AND (([Evo_Description] = @original_Evo_Description) OR ([Evo_Description] IS NULL AND @original_Evo_Description IS NULL)) AND [UnitRate] = @original_UnitRate AND [MinRate] = @original_MinRate AND [RateBeforeSevenDays] = @original_RateBeforeSevenDays AND [RateAfterSevenDays] = @original_RateAfterSevenDays" InsertCommand="INSERT INTO [rates] ([Period_Id], [Evo_StockLink], [Evo_ItemCode], 
[Evo_Description], [UnitRate], [MinRate], [RateBeforeSevenDays], [RateAfterSevenDays]) VALUES (@Period_Id, @Evo_StockLink, @Evo_ItemCode, @Evo_Description, @UnitRate, @MinRate, @RateBeforeSevenDays, @RateAfterSevenDays)" UpdateCommand="UPDATE [rates] SET [Period_Id] = @Period_Id, [Evo_StockLink] = @Evo_StockLink, 
[Evo_ItemCode] = @Evo_ItemCode, [Evo_Description] = @Evo_Description, [UnitRate] = @UnitRate, [MinRate] = @MinRate, [RateBeforeSevenDays] = @RateBeforeSevenDays, [RateAfterSevenDays] = @RateAfterSevenDays WHERE [id] = @original_id AND (([Period_Id] = @original_Period_Id) OR ([Period_Id] IS NULL AND @original_Period_Id IS NULL)) AND [Evo_StockLink] = @original_Evo_StockLink AND [Evo_ItemCode] = @original_Evo_ItemCode AND (([Evo_Description] = @original_Evo_Description) OR ([Evo_Description] IS NULL AND @original_Evo_Description IS NULL)) AND [UnitRate] = @original_UnitRate AND [MinRate] = @original_MinRate AND [RateBeforeSevenDays] = @original_RateBeforeSevenDays AND [RateAfterSevenDays] = @original_RateAfterSevenDays"> 
     <DeleteParameters> 
      <asp:Parameter Name="original_id" Type="Int32" /> 
      <asp:Parameter Name="original_Period_Id" Type="Int32" /> 
      <asp:Parameter Name="original_Evo_StockLink" Type="Int32" /> 
      <asp:Parameter Name="original_Evo_ItemCode" Type="String" /> 
      <asp:Parameter Name="original_Evo_Description" Type="String" /> 
      <asp:Parameter Name="original_UnitRate" Type="Double" /> 
      <asp:Parameter Name="original_MinRate" Type="Double" /> 
      <asp:Parameter Name="original_RateBeforeSevenDays" Type="Double" /> 
      <asp:Parameter Name="original_RateAfterSevenDays" Type="Double" /> 
     </DeleteParameters> 
     <InsertParameters> 
      <asp:Parameter Name="Period_Id" Type="Int32" /> 
      <asp:Parameter Name="Evo_StockLink" Type="Int32" /> 
      <asp:Parameter Name="Evo_ItemCode" Type="String" /> 
      <asp:Parameter Name="Evo_Description" Type="String" /> 
      <asp:Parameter Name="UnitRate" Type="Double" /> 
      <asp:Parameter Name="MinRate" Type="Double" /> 
      <asp:Parameter Name="RateBeforeSevenDays" Type="Double" /> 
      <asp:Parameter Name="RateAfterSevenDays" Type="Double" /> 
     </InsertParameters> 
     <UpdateParameters> 
      <asp:Parameter Name="Period_Id" Type="Int32" /> 
      <asp:Parameter Name="Evo_StockLink" Type="Int32" /> 
      <asp:Parameter Name="Evo_ItemCode" Type="String" /> 
      <asp:Parameter Name="Evo_Description" Type="String" /> 
      <asp:Parameter Name="UnitRate" Type="Double" /> 
      <asp:Parameter Name="MinRate" Type="Double" /> 
      <asp:Parameter Name="RateBeforeSevenDays" Type="Double" /> 
      <asp:Parameter Name="RateAfterSevenDays" Type="Double" /> 
      <asp:Parameter Name="original_id" Type="Int32" /> 
      <asp:Parameter Name="original_Period_Id" Type="Int32" /> 
      <asp:Parameter Name="original_Evo_StockLink" Type="Int32" /> 
      <asp:Parameter Name="original_Evo_ItemCode" Type="String" /> 
      <asp:Parameter Name="original_Evo_Description" Type="String" /> 
      <asp:Parameter Name="original_UnitRate" Type="Double" /> 
      <asp:Parameter Name="original_MinRate" Type="Double" /> 
      <asp:Parameter Name="original_RateBeforeSevenDays" Type="Double" /> 
      <asp:Parameter Name="original_RateAfterSevenDays" Type="Double" /> 
     </UpdateParameters> 
    </asp:SqlDataSource> 
+0

を理解するためのhereを参照してください私たちのGridViewのASPXを示しました。 – BNN

+0

aspxページを表示しない限り、問題を正確に特定できません。しかし、「索引が範囲外です」というのは、存在しない索引にアクセスしようとするときです。ほとんどの場合、 'row.Cells [Index] .Controls [0]'にある可能性があります。正確な問題を特定するには、コードをデバッグし、正確にエラーが発生する場所を確認します。 – SpiderCode

+0

@NK質問を編集してaspxを追加しました。 –

答えて

2

あなたのaspxページでDataKeyNamesを言及していません。ただし、RowUpdatingでは、Datakeyの値[0]にアクセスしようとしています。そのため、このエラーが発生しています。

解決方法: aspxページで "DataKeyNames = ID"を指定してください。

はDataKeyの概念

+0

こんにちは、DataKeyNames = "Id"に追加しました。ソリューションを実行すると、DB全体が値1にデフォルト設定されました。ユーザーは全体の価値を持っていますか?あなたの助けが大変ありがとうございます。 –

+0

これは、各フィールドの値をケースのIDフィールドの値であるDataKey値に設定しているためです。これがすべてを1に設定する理由です。 –

+0

これを修正するには、フィールドの値をあなたは "Evo_ItemCode"でやったことがありますかNewValues []アプローチを試すことができます、[ここ](http://stackoverflow.com/questions/28717301/get-datafield-value-while-updating-row-asp-gridview- –

関連する問題