2016-08-12 8 views
0

LoginView内にGridViewがあり、Index Of Rangeエラーが発生しています。 GridViewに行数を表示すると、このエラーの原因となる0が常に表示されます。LoginViewのGridViewが間違った行数を与える

GridViewがLoginView内で正常に動作するためには、何か具体的なことがありますか?

以下は、GridViewのボタンをクリックすると実行されるコードで、エラーはGridView row = gv.Rows[e.RowIndex];行にのみ表示されます。 e.RowIndexだけを使用した場合、私はエラーを表示せず、実際に正しい番号を返します。 gv.DataKeys.Countを実行すると、正しいカウントが返されます。もし私がgv.Rows.Countをしたら、それは常に0になるでしょう。私はpage_loadで行数を計算すると正しいカウントを返すので、PostBackと何か関係があると思います。あなたが私に投稿するために必要なことが他にもあれば教えてください。

protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    try 
    { 
     GridView gv = ReviewLoginView.FindControl("gvReview") as GridView; 
     GridViewRow row = gv.Rows[e.RowIndex]; 

     string Id = (row.FindControl("lblID") as Label).Text; 

     string constr = System.Configuration.ConfigurationManager.AppSettings["ObservationCardCS"]; 
     using (SqlConnection con = new SqlConnection(constr)) 
     { 
      using (SqlCommand cmd = new SqlCommand("cardReview")) 
      { 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.AddWithValue("@id", Id); 

       cmd.Connection = con; 
       con.Open(); 
       cmd.ExecuteNonQuery(); 
       con.Close(); 
      } 
     } 
     gv.EditIndex = -1; 
     this.BindGrid(); 

    } 
    catch (Exception ex) 
    { 

     GridView gv = ReviewLoginView.FindControl("gvReview") as GridView; 

     int index = e.RowIndex; 

     lblError.ForeColor = System.Drawing.Color.Red; 
     lblError.Text = ex.Message + " " + index.ToString() + " " + gv.Rows.Count; 
    } 
} 

以下は、aspxページからのLoginViewです。以下は

<asp:LoginView runat="server" ViewStateMode="Disabled" ID="ReviewLoginView"> 
     <LoggedInTemplate> 
     <%--<AnonymousTemplate>--%> 
      <div> 
       <asp:GridView ID="gvReview" runat="server" AutoGenerateColumns="false" DataKeyNames="ID" 
        OnRowDataBound="OnRowDataBound" OnRowDeleting="OnRowDeleting" EnableViewState="true" 
        EmptyDataText="No records have been added." AllowSorting="true" ShowHeaderWhenEmpty="true" 
        AlternatingRowStyle-BackColor="#e0e0e0" HeaderStyle-BackColor="#d0d0d0" ViewStateMode="Disabled" 
        EnableSortingAndPagingCallbacks="false"> 
        <Columns> 
         <asp:TemplateField HeaderText="ID" ShowHeader="false" Visible="true"> 
          <ItemTemplate> 
           <asp:Label ID="lblID" runat="server" Text='<%# Bind("ID") %>' CssClass="cmsID"></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="User"> 
          <ItemTemplate> 
           <asp:Label ID="lblSubmittedBy" runat="server" Text='<%# Eval("submittedBy") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Location"> 
          <ItemTemplate> 
           <asp:Label ID="lblLocation" runat="server" Text='<%# Eval("location") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Date"> 
          <ItemTemplate> 
           <asp:Label ID="lblSubmittedDate" runat="server" Text='<%# Eval("submittedDate") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="What Was Observed?"> 
          <ItemTemplate> 
           <asp:Label ID="lblWhatWasObserved" runat="server" Text='<%# Eval("whatWasObserved") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="What Action Was Taken?"> 
          <ItemTemplate> 
           <asp:Label ID="lblWhatActionWasTaken" runat="server" Text='<%# Eval("whatActionWasTaken") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="What Agreement Was Reached?"> 
          <ItemTemplate> 
           <asp:Label ID="lblWhatAgreementWasReached" runat="server" Text='<%# Eval("whatAgreementWasReached") %>'></asp:Label> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField HeaderText="Edit"> 
          <ItemTemplate> 
           <asp:Button ID="btnSubmit" runat="server" Text="Edit" CssClass="editbutton" /> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:CommandField HeaderText="Review" ButtonType="Button" ShowDeleteButton="true" DeleteText="Review" /> 
        </Columns> 
       </asp:GridView> 
      </div> 
      </LoggedInTemplate> 
     <%--</AnonymousTemplate>--%> 
        <AnonymousTemplate> 
      You must login to view submitted Observation Cards. 
     </AnonymousTemplate> 
    </asp:LoginView> 

BindGrid()以下

private void BindGrid() 
{ 
    try 
    { 
     SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["ObservationCardCS"]); 
     { 
      SqlCommand comm = new SqlCommand("cardSelectNew2", conn); 
      SqlDataAdapter sda = new SqlDataAdapter(); 
      sda.SelectCommand = comm; 
      comm.CommandType = CommandType.StoredProcedure; 
      comm.Parameters.AddWithValue("@Begin", "1/1/1950"); 
      comm.Parameters.AddWithValue("@End", "12/31/2049"); 
      comm.Parameters.AddWithValue("@Reviewed", "0"); 
      comm.Parameters.AddWithValue("@OrderBy", "CH.id"); 
      comm.Parameters.AddWithValue("@AscDesc", "Asc"); 
      comm.Parameters.AddWithValue("@DateRange", "Last 30 Days"); 

      comm.Connection = conn; 
      sda.SelectCommand = comm; 

      DataTable dt = new DataTable(); 
      sda.Fill(dt); 

      GridView gv = ReviewLoginView.FindControl("gvReview") as GridView; 

      gv.DataSource = dt; 
      gv.DataBind(); 

     } 
    } 
    catch (Exception ex) 
    { 
     lblError.ForeColor = System.Drawing.Color.Red; 
     lblError.Text = ex.Message; 
    } 
} 

は、あなたが正しい軌道に乗っている私をPage_Load

protected void Page_Load(object sender, EventArgs e) 
{ 

    if (!this.IsPostBack) 
    { 
     this.BindGrid(); 
     lblError.ForeColor = System.Drawing.Color.Black; 
     lblError.Text = ""; 
    } 

} 
+1

fyiの中では、closeメソッド 'con.Close()'を呼び出す必要はありません。また、ストアドプロシージャは何ですか?これはSelect Query Update Query ..ですか? Select Queryの場合は、Datatable.FillメソッドのDataAdapeterを使用するためにcmd.ExecuteNonQueryを変更する必要があります。 – MethodMan

+0

Stored Procは、ビット列をチェックするだけでレコードを「レビュー済み」としてマークします。 BindData()コードにDatatable.Fillメソッドがあります。 – b3ns

+0

あなたのマークアップを表示してください – naveen

答えて

0

です!しかし、クラス全体とマークアップを見ることなく、推測することしかできません。

グリッドとデータソースがマークアップで定義されている場合、ページのポストバックの間にデータをキャッシュまたは再クエリする必要がある場合は、ページロードイベントハンドラのデータを消去または再構築しないことを確認し、EnableRowCacheをオンポストバック中にデータを再クエリする必要がないようにGridViewを作成します。

protected void OnRowDeleting(object sender, GridViewDeleteEventArgs e) 
{ 
    this.BindGrid(); 
    try 
    { 
... delete logic 
     this.BindGrid(); // re-load after the change 
    } 
    catch (Exception ex) 
    { 
... 
    } 
} 
:あなたは、おそらく最も簡単な解決策は、あなたが行にアクセスしようとする前に、データがBindGridを呼び出すことにより、最初にロードされることを保証することであってもよい、#OldSchool BindGrid()データ・ロード・パターンを使用しているように見えます

行キャッシュを有効にしないと、グリッドに同じデータが同じ順序でロードされていることを確認する必要があります。または、行の主キーではなく行インデックスに基づいてこのようなロジックを削除すると、間違ったデータ行。

+0

コードを投稿しようとするたびに、フォーマットエラーが発生します。私が助けてくれる投稿できるものがありますか? BindGrid()が必要なときだけ実行するように、私はpage_loadにコードを追加しました。私はOnRowDeletingメソッドのtry/catchの前にthis.BindGrid()を追加しましたが、もはやエラーはなくなりましたが、何も起こりません。私が見るところでは、page_loadとOnRowDeletingの間でデータを再構築しているところはどこにも見えません。その他の提案はありますか? – b3ns

+0

グリッド上でViewStateMode = "Disabled"を削除してみるか、明示的に有効に設定してください。 –

+0

削除を試み、明示的に有効に設定しようとしました。まだ正常に動作しませんでした。これは私に困惑している! – b3ns

関連する問題