2016-04-12 13 views
0

皆さん。私はあなたの助けが必要でした。私はオンラインワークショップ登録システムを作成しています。私は、フェスティバル期間中に利用可能なワークショップをすべて表示するinicaleグリッドビューを持っています。私はセッションとチェックボックスを使用して、その人が次のページの「ショッピングカート」に入れたいワークショップを取得しています。私がする必要があったのは、SQLデータベースの注文テーブルに書かれたインシアル注文を正しいものにした後です。私が問題を抱えているのは、ショッピングカートの他のグリッドビューに格納されている登録データを書き込むときです。私は注文詳細テーブルに新しいエントリとして各行を書いています。私がこれをすると、プログラムは非常に奇妙なことをします。最初のページにすべてのワークショップ情報を保持しているグリッドビューからすべてのデータを書き込むようです。注文詳細テーブルにショッピングカートの行を記述するための コード:グリッドビューからデータベーステーブルに行を移動する必要がありました。

protected void btn_Submit_Click1(object sender, EventArgs e) 
{ 

    foreach (GridViewRow row in Basket.Rows) 
    {      
       Label lblCatCode = (Label)row.FindControl("lblCatCode"); 
       Label lblTitle = (Label)row.FindControl("lblTitle"); 

      SqlConnection conBasket = new SqlConnection("Data Source=JONS\\SQLEXPRESS;Initial Catalog=OFFFV2;Integrated Security=True"); 
      SqlCommand cmdBasket = new SqlCommand("Insert into OrderDetail(OrderID,CatalogeCode,Title)Values(@OrderID,@CatCode,@Title)", conBasket); 

      cmdBasket.Parameters.AddWithValue("@OrderID", lblOrderNumber.Text); 
      cmdBasket.Parameters.AddWithValue("@CatCode", lblCatCode.Text); 
      cmdBasket.Parameters.AddWithValue("@Title", lblTitle.Text); 

      try 
      { 
       conBasket.Open(); 
       cmdBasket.ExecuteNonQuery(); 
       conBasket.Close(); 
      } 
      catch (Exception ex) 
      { 
       lbl_Error.Text = "A database error has orrued. <br <br />" + "Message: " + ex.Message; 
      } 
     } 
    } 

ここでは、私は私の最後のポストは不明であったと閉じたことを理解するGridView

<asp:GridView ID="Basket" runat="server" AutoGenerateColumns="False" DataKeyNames="WorkshopID" DataSourceID="BasketData" EnableViewState="False" ShowFooter="True" OnRowCreated="Basket_RowCreate" CellPadding="4" ForeColor="#333333" GridLines="None" > 
    <AlternatingRowStyle BackColor="White" /> 
    <Columns> 
     <asp:TemplateField HeaderText="Remove"> 
      <ItemTemplate> 
       <asp:CheckBox ID="cb_BasketRemove" runat="server" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Cataloge Code" SortExpression="CatalogeCode"> 
      <EditItemTemplate> 
       <asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("CatalogeCode") %>'></asp:TextBox> 
      </EditItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="lblCatCode" runat="server" Text='<%# Eval("CatalogeCode") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Title" SortExpression="Title"> 
      <ItemTemplate> 
       <asp:Label ID="lblTitle" runat="server" Text='<%# Eval("Title") %>'></asp:Label> 
      </ItemTemplate> 
      <FooterTemplate> 
       <strong> 
        Total Price: 
       </strong> 
      </FooterTemplate> 
     </asp:TemplateField> 
     <asp:TemplateField HeaderText="Price" SortExpression="Price"> 
      <ItemTemplate> 
       <asp:Label ID="Price" runat="server" Text='<%# Eval("Price") %>'></asp:Label> 
      </ItemTemplate> 
      <FooterTemplate> 
       <strong> 
        <asp:Literal ID="TotalPrice" runat ="server" /> 
       </strong> 
      </FooterTemplate> 
     </asp:TemplateField> 
    </Columns> 
    <EditRowStyle BackColor="#2461BF" /> 
    <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> 
    <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> 
    <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> 
    <RowStyle BackColor="#EFF3FB" /> 
    <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> 
    <SortedAscendingCellStyle BackColor="#F5F7FB" /> 
    <SortedAscendingHeaderStyle BackColor="#6D95E1" /> 
    <SortedDescendingCellStyle BackColor="#E9EBEF" /> 
    <SortedDescendingHeaderStyle BackColor="#4870BE" /> 
</asp:GridView> 

ためのコードです。私はプログラムが何をしているのか、なぜ迷っているのですか?私はそれが最初のグリッドビューからショッピングカートにデータを取得する方法と関連しているのだろうかと思っています。
ここ は、選択した行のセッションのためのコードである

protected void Page_Load(object sender, EventArgs e) 
{ 

} 

protected void btt_Select_Click(object sender, EventArgs e) 
{ 
    var selectedWorkshop = GridView1.Rows.Cast<GridViewRow>().Where(row => ((CheckBox)row.FindControl("RegisteredWorkshop")).Checked).Select(row => GridView1.DataKeys[row.RowIndex].Value.ToString()).ToList(); 
    if (Session["cart"] == null) 
    { 
    Session["cart"] = selectedWorkshop; 
    } 
    else 
    { 
    var cart = (List<string>)Session["cart"]; 
     foreach (var workshop in selectedWorkshop) 
      cart.Add(workshop); 
     Session["cart"] = cart; 
    } 
    foreach (GridViewRow row in GridView1.Rows) 
    { 
     CheckBox cb = (CheckBox)row.FindControl("RegisteredWorkshop"); 
     if (cb.Checked) 
      cb.Checked = false; 
    } 
} 
protected void btt_CheckOut_Click(object sender, EventArgs e) 
{ 
    if (Session["cart"] != null) 
     Response.Redirect("Checkout.aspx"); 

} 
} 

登録者は、様々なワークショップから選択する場所から選択するGridViewのコード:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource3" CellPadding="4" DataKeyNames="WorkshopID" ForeColor="#333333" GridLines="None"> 
     <AlternatingRowStyle BackColor="White" /> 
     <Columns> 
      <asp:TemplateField HeaderText ="Register"> 
       <ItemTemplate> 
        <asp:CheckBox ID="RegisteredWorkshop" runat="server" /> 
       </ItemTemplate> 
      </asp:TemplateField> 
      <asp:BoundField DataField="FestivalYear" HeaderText="Festival Year" /> 
      <asp:BoundField DataField="CatalogeCode" HeaderText="Catalog Code" /> 
      <asp:BoundField DataField="Title" HeaderText="Title" /> 
      <asp:BoundField DataField="WSDescription" HeaderText="Workshop Description" /> 
      <asp:BoundField DataField="DayOffered" HeaderText="Day Offered" /> 
      <asp:BoundField DataField="Lenght" HeaderText="Workshop Lenght" /> 
      <asp:BoundField DataField="BeginingTime" HeaderText="Start Time" /> 
      <asp:BoundField DataField="Price" HeaderText="Workshop Fee" /> 
      <asp:BoundField DataField="WorkshopID" HeaderText="Workshop Id" Visible="False" /> 
     </Columns> 
+0

はあなたのプログラムをデバッグしようとしたことがありますか?私はあなたの問題が何であるかまだ分かりませんが、達成しようとしていることを明確に説明できますか? – Hendry

+0

はい、IDバスケットのgridviewを介してのみ実行する必要があるforeachループが実際にバスケットIDの入力に使用するデータソースにアクセスしているようです。データソースは、ワークショップからの簡単なselect *(異なるワークショップ情報を保持するテーブルです。この時点では、テストには3つのワークショップしかありません)。しかし、foreachループが発生すると、カタログコードとタイトルが取得されます。現在のワークショップの3つすべてがワークショップのテーブルに格納されています。 – Griman

答えて

0

は私が間違っているかもしれないが、それが見えますあなたの変数の命名はオフです(バスケットとカートを混同しますか?)。あなたはこのような何かをする必要があるかもしれません

protected void btn_Submit_Click1(object sender, EventArgs e) 
{ 
    var Basket = (List<string>)Session["cart"]; // ADD THIS LINE 

    foreach (GridViewRow row in Basket.Rows) 
    {  
+0

basketはgridview IDで、cartは選択したワークショップを元のページから呼び出すセッション名です。 – Griman

+0

スティーブ、アイデアのためにありがとうが、それは動作しません。 foreachループは、注文の詳細リストに配置したい別のラベルに対して実行するためのgridviewを探しているためです。私は、ヘンドリーのコメントに何が起こっているのか少し説明しました。 – Griman

関連する問題