2017-10-04 4 views
-1

私は2時間以上私の頭を掻いてきました。私はそれを理解できないようです。ASP.NET C#elseが無視される場合は?

基本的に私が行ったのは、選択した入札者ボタンをクリックすると、ステータスの下に「勝者」が表示されました。問題は、ボトムセレクトの入札者ボタンを選択し、その上にあるボタンをアクティブにするときです。エラーメッセージ "勝者を選択できません。エラー原因:既に勝者を選択しました。"というエラーメッセージが表示されます。は無視され、ステータスフィールドに「勝者」と書き込まれます。

私は別の方法でやろうとするとエラーメッセージが表示されます。最初の行のボタンを選択してステータスを勝者に設定し、2行目のボタンを選択すると、すでに他の人物を選んだので勝者を選ぶことはできません。

私のC#コード:

protected void rptrBindBidders_ItemCommand(object source, RepeaterCommandEventArgs e) 
{ 
    if (e.CommandName == "Winner" && e.CommandArgument.ToString() != "") 
    { 
     Int64 onsaleID = Convert.ToInt64(Request.QueryString["saleID"]); 

     String CS = ConfigurationManager.ConnectionStrings["DatabaseSQLConnectionString1"].ConnectionString; 
     using (SqlConnection con = new SqlConnection(CS)) 
     { 
      using (SqlCommand cmd1 = new SqlCommand("select * from Bidders where saleID=" + onsaleID + " ", con)) 
      { 
       SqlDataAdapter sda = new SqlDataAdapter(cmd1); 
       DataTable dt = new DataTable(); 
       sda.Fill(dt); 

       string BidderStatus = dt.Rows[0]["BidderStatus"].ToString().Trim(); 

       if (BidderStatus == "Winner") 
       { 
        lblmessage.ForeColor = Color.Red; 
        lblmessage.Text = "Cannot select winner. Error cause: You have already selected a winner."; 
       } 

       else 
       { 
        using (SqlCommand cmd = new SqlCommand("update Bidders set [BidderStatus]='Winner' where [bidID]='" + e.CommandArgument.ToString() + "'", con)) 
        { 


         con.Open(); 
         cmd.ExecuteNonQuery(); 

         lblmessage.ForeColor = Color.Green; 
         lblmessage.Text = "Success! A bidder has been selected!"; 


         con.Close(); 

        } 
       } 

       this.BindBidders(); 
      } 
     } 
    } 
} 
} 

私のHTMLコード:おそらくbidIdとsaleIdを混同

<asp:Repeater ID="rptrBindBidders" onItemCommand="rptrBindBidders_ItemCommand" runat="server"> 
     <HeaderTemplate> 
    <table class="table"> 
     <thead> 
      <tr> 
       <th>Bidders</th> 
       <th>Date bidded</th> 
       <th>Price Offer</th> 
       <th>Status</th> 
      </tr> 
     </thead> 
      <tbody> 
     </HeaderTemplate> 

     <ItemTemplate> 
       <tr> 
        <td><%# Eval("BidderName") %></td> 
        <td><%#Eval("DateBidded") %></td> 
        <td>₱<%# Eval("bidPrice") %></td> 
        <td><%# Eval("BidderStatus") %></td> 
        <td><asp:Button ID="btnSelectBuyer" runat="server" Text="Select Bidder" CommandName="Winner" CommandArgument='<%#Eval("bidID") %>'/></td> 
        <!--<asp:HiddenField ID="hfbidID" Value='' runat="server" />--> 
        <!--<asp:HiddenField ID="hfBidderName" Value='' runat="server" />--> 
       </tr> 
     </ItemTemplate> 

     <FooterTemplate> 
      </tbody> 
    </table> 
     </FooterTemplate> 
</asp:Repeater> 
+2

'If'は決して無視されません。 'Else'は決して無視されません。コンパイラは常に、常に、あなたがそれを与える指示に常に忠実に従います。ブレークポイントを入れ、デバッガでコードをステップ実行して、実際に何が実行されているか調べます。変数の上にマウスを置くか、ウォッチウィンドウを使用して、なぜそれが何をするのかを理解してください。 'BidderStatus'が何であるかを調べる。前提を作ることによって、あなたの周りの世界について何も学ぶことはできません。外に出て観察するだけで学ぶことができます。 –

+1

クエリのSQLインジェクションに注意してください。 – Alejandro

答えて

0

。私は同じsaleIdと異なるBidIdを持つ多くの入札者が存在することができると思います。 基本的には、すべての入札者を検索し、最初のステータスを確認するだけです。したがって、あなたのコードは、最初のアイテムが選択されている場合にのみ、 "if(BidderStatus ==" Winner ")"をtrueに評価します。あなたの選択を "select count(1)"に変更し、where句を追加して勝者のみを選択し、0より大きい値を返すかどうかを確認します。

1

SqlDataReaderを使用して、DataTableを記入することなく、勝者が直接いるかどうかを確認できますか?

using(var connection = new SqlConnection(cs) 
{ 
    // SELECT 1 because we don't care about the returned data 
    using(var cmd = new SqlCommand($"SELECT 1 FROM [Bidders] WHERE saleID={onsaleID} AND BidderStatus='Winner'", connection)) 
    { 
     cmd.CommandType = CommandType.Text; 

     using(var reader = cmd.ExecuteReader()) 
     { 
      if(reader.Read()) 
      { 
       // The command returned rows (there is an existing winner for the given `onsaleID`) 
      } 
      else 
      { 
       // The command returned no rows. There is no winner. 
      } 
     } 
    } 
} 
+0

それは私のためにそれをした。ありがとう! – exzalted

関連する問題