2017-10-04 58 views
-1

我一直在撓我的頭超過兩個小時。我似乎無法弄清楚。ASP.NET C#如果其他被忽略?

基本上我做的是「贏家」出現在狀態下,當我點擊選擇投標人按鈕。問題是,當我選擇底部選擇投標人按鈕,然後激活它上面的按鈕。如果其他決定顯示錯誤消息「無法選擇贏家,錯誤原因:您已經選擇了贏家。」被忽略,並繼續在狀態字段上寫「贏家」。

錯誤消息將顯示,如果我嘗試以其他方式做。選擇第一行中的按鈕將狀態設置爲贏家,然後選擇第二行按鈕會告訴我,我不能選擇贏家,因爲我已經選擇了其他人。

我的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代碼:

<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

你可能混淆bidId和saleId。我想這可以存在很多BidI具有相同的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