2017-08-04 13 views
0

私は解決策のためにここや他のサイトで3日間検索しています。私は1つ以上の行を(チェックボックスを使用して)選択し、選択された行をグリッドビューから削除する必要があります。データソースはセッションデータテーブルです。 SQLConnectionsやLINQエンティティには関係ありません。その結果、私はe.commandargumentsを使用する必要があるかどうか、またはそれについてどうやって行くべきかはわかりませんが、私は運が無ければそれを試しました。gridiewデータソースから行を選択および削除するためのチェックボックスを使用して=セッションC#.net

どのような援助が大幅に高く評価した場合にされるだろう

(chkRemCart!= nullを& & chkRemCart.Checked)場合、エラーが表示さと明確に以下の方法

内CART.ASPX.CSページにコメントしていますソリューションに役立つコーディングや説明が必要な場合は、尋ねてください。 ありがとうございます。

CART.ASPX

<asp:GridView ID="gvCart" runat="server" AutoGenerateColumns="False" ShowHeaderWhenEmpty="true" CellPadding="4" 
     HeaderStyle-CssClass="header" EmptyDataText="You have successfully cleared your Shopping Cart" 
     OnRowDataBound="gvCart_RowDataBound" > 
     <Columns> 
      <asp:TemplateField HeaderText="Movie Selector"> 
       <ItemTemplate> 
        <asp:CheckBox ID="chkRemCart" runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Movie ID"> 
       <ItemTemplate> 
        <asp:Label ID="lblMovieID" runat="server" Text='<%# Eval("MovieId") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Name"> 
       <ItemTemplate> 
        <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Duration"> 
       <ItemTemplate> 
        <asp:Label ID="lblDuration" runat="server" Text='<%# Eval("Duration") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Genre"> 
       <ItemTemplate> 
        <asp:Label ID="lblGenre" runat="server" Text='<%# Eval("Genre") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Rating"> 
       <ItemTemplate> 
        <asp:Label ID="lblRating" runat="server" Text='<%# Eval("Rating") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Price"> 
       <ItemTemplate> 
        <asp:Label ID="lblPrice" runat="server" Text='<%# Eval("Price","{0:n}") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Description"> 
       <ItemTemplate> 
        <asp:Label ID="lblDescription" runat="server" Text='<%# Eval("Description") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Total"> 
       <ItemTemplate> 
        <asp:Label ID="lblTotal" runat="server"></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
</asp:GridView> 

<asp:Button ID="btnRem" runat="server" OnClick="RemCart" Text="Remove Selection" CssClass="button" Title="Remove Movies From Cart" /> 

CART.ASPX.CS

RefreshPagesを呼び出すをPage_Load()メソッド。背後にある以下のようなのGridViewでデータソース/セッション内の項目のすべての列と行を表示gvCart/DataTableの

public void RefreshPages() 
    { 
     if (Session["SelectedMovies"] != null) 
     { 
      DataTable MovieTable = (DataTable)Session["SelectedMovies"]; 
      gvCart.DataSource = MovieTable; 
      gvCart.DataBind(); 
     } 
    } 

    protected void RemCart(object sender, EventArgs e) 
    { 
     // Check session exists 
     if (Session["selectedMovies"] != null) 
     { 
      // Opening/Retreiving DataTable. 
      DataTable MovieTable = (DataTable)Session["SelectedMovies"]; 

      foreach (GridViewRow row in gvCart.Rows) 
      { 
       CheckBox chkRemCart = row.Cells[0].FindControl("chkRemCart") as CheckBox; 

       if (chkRemCart != null && chkRemCart.Checked) 
       { 
        // Error appearing on line below. Scroll right to read. 
        int MovieId = Convert.ToInt32(gvCart.DataKeys[row.RowIndex].Value); // Error here. //Additional information: Index was out of range. Must be non - negative and less than the size of the collection. 

        MovieTable.Rows.RemoveAt(row.RowIndex); 

        //Saving session 
        Session["selectedMovies"] = MovieTable; 
        // Updating gvCart 
        gvCart.DataSource = MovieTable; 
        gvCart.DataBind(); 
       } 
      } 
     } 
    } 

答えて

0

割り当てDataKeyNames = "主キー" とチェック

<asp:GridView ID="gvCart" runat="server" AutoGenerateColumns="False" ShowHeaderWhenEmpty="true" DataKeyNames="MovieId" CellPadding="4" 
     HeaderStyle-CssClass="header" EmptyDataText="You have successfully cleared your Shopping Cart" 
     OnRowDataBound="gvCart_RowDataBound" > 
     <Columns> 
      <asp:TemplateField HeaderText="Movie Selector"> 
       <ItemTemplate> 
        <asp:CheckBox ID="chkRemCart" runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Movie ID"> 
       <ItemTemplate> 
        <asp:Label ID="lblMovieID" runat="server" Text='<%# Eval("MovieId") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Name"> 
       <ItemTemplate> 
        <asp:Label ID="lblName" runat="server" Text='<%# Eval("Name") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Duration"> 
       <ItemTemplate> 
        <asp:Label ID="lblDuration" runat="server" Text='<%# Eval("Duration") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Genre"> 
       <ItemTemplate> 
        <asp:Label ID="lblGenre" runat="server" Text='<%# Eval("Genre") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Rating"> 
       <ItemTemplate> 
        <asp:Label ID="lblRating" runat="server" Text='<%# Eval("Rating") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Price"> 
       <ItemTemplate> 
        <asp:Label ID="lblPrice" runat="server" Text='<%# Eval("Price","{0:n}") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Description"> 
       <ItemTemplate> 
        <asp:Label ID="lblDescription" runat="server" Text='<%# Eval("Description") %>'></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 

      <asp:TemplateField HeaderText="Total"> 
       <ItemTemplate> 
        <asp:Label ID="lblTotal" runat="server"></asp:Label> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
</asp:GridView> 

コード:

public void RefreshPages() 
     { 
      if (Session["SelectedMovies"] != null) 
      { 
       DataTable MovieTable = (DataTable)Session["SelectedMovies"]; 
       gvCart.DataSource = MovieTable; 
       gvCart.DataBind(); 
      } 
     } 

    protected void RemCart(object sender, EventArgs e) 
    { 
     // Check session exists 
     if (Session["selectedMovies"] != null) 
     { 
      // Opening/Retreiving DataTable. 
      DataTable MovieTable = (DataTable)Session["SelectedMovies"]; 

      foreach (GridViewRow row in gvCart.Rows) 
      { 
       CheckBox chkRemCart = row.Cells[0].FindControl("chkRemCart") as CheckBox; 

       if (chkRemCart != null && chkRemCart.Checked) 
       { 
        // Error appearing on line below. Scroll right to read. 
        int MovieId = Convert.ToInt32(gvCart.DataKeys[row.RowIndex].Value); // Error here. //Additional information: Index was out of range. Must be non - negative and less than the size of the collection. 

        DataRow[] drs = dt.Select("MovieId = '" + MovieId + "'"); // replace with your criteria as appropriate 

        if (drs.Length > 0) 
        { 
         MovieTable.Rows.Remove(drs[0]); 
        } 
       } 
      } 
      //Saving session 
      Session["selectedMovies"] = MovieTable; 
      // Updating gvCart 
      gvCart.DataSource = MovieTable; 
      gvCart.DataBind(); 
     } 
    } 
関連する問題