2017-08-04 16 views
0

我一直在尋找這裏和其他網站三天的解決方案。我需要選擇一行或多行(使用複選框),並從gridview中刪除選定的行,這些行的數據源是會話數據表,您將看到。對SQLConnections或LINQ實體不感興趣。因此我不確定是否需要使用e.com和參數,或者如何去解決這個問題,但是我沒有嘗試過它們。使用複選框來選擇和刪除gridiew datasource =會話的C#.net

錯誤是可見的,明確的評論CART.ASPX.CS頁以下方法

如果裏面(chkRemCart!= NULL & & chkRemCart.Checked)

任何援助將不勝感激,如果你需要任何進一步的編碼或解釋來幫助解決問題,只是問。 預先感謝您。

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

的Page_Load調用RefreshPages()方法。 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 = 「的PrimaryKey」 在GridView中像下面,檢查

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