2017-11-14 8 views
1

Ich versuche, eine winforms-Anwendung zu machen, also wenn etwas geklickt wird, überprüft es eine Webseite für seine Antwort.C# ignoriere sonst wenn Aussage

Ich habe die Webseite getestet, um zu sehen, ob es ein PHP-Fehler ist, aber es funktioniert gut von dieser Seite.

Es ignoriert die else if-Anweisung vollständig und überspringt die else-Anweisung darunter, obwohl die Antwort "Nicht zugewiesen" ist.

Hier ist mein Code:

private void button1_Click(object sender, EventArgs e) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://fms.psrpc.co.uk/apiconfirmD.php?" + ApiKey); 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     using (response) 
     { 
      StreamReader reader = new StreamReader(response.GetResponseStream()); 
      if (reader.ReadToEnd() == "Changed") 
      { 
       label2.Visible = false; 
       button1.Enabled = false; 
       button2.Enabled = true; 
       button3.Enabled = true; 
       button4.Enabled = true; 
       button5.Enabled = true; 
       button6.Enabled = true; 
       button7.Enabled = true; 
       button8.Enabled = true; 
       timer1.Enabled = true; 
      } 
      else if (reader.ReadToEnd() == "Unassigned") 
      { 
       string message = "Error Code: [email protected]@Error booking [email protected] make sure you have been assigned to a [email protected]@If this error persists please contact K.McCrudden."; 
       message = message.Replace("@", "" + System.Environment.NewLine); 
       string title = "Error!"; 

       MessageBoxButtons buttons = MessageBoxButtons.OK; 
       DialogResult result = MessageBox.Show(message, title, buttons, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2); 
      } 
      else 
      { 
       string message = "Error Code: [email protected]@Error booking [email protected] make sure you have booked a shift and have been [email protected]@If this error persists please contact K.McCrudden."; 
       message = message.Replace("@", "" + System.Environment.NewLine); 
       string title = "Error!"; 

       MessageBoxButtons buttons = MessageBoxButtons.OK; 
       DialogResult result = MessageBox.Show(message, title, buttons, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2); 
      } 
     } 
    } 
+3

If-Anweisungen übersprungenen nicht einfach sind. Ich würde Sie dringend bitten, zu überprüfen, was "reader.ReadToEnd() ==" Unassigned "' tatsächlich evaluiert. – Carcigenicate

+8

Nachdem Sie 'ReadToEnd()' einmal aufgerufen haben, was erwarten Sie, dass ein zweiter Anruf zurückkehrt? Tipp: Sie haben * bis zum Ende * des Lesers gelesen. Was kann es sonst noch zu lesen geben? Zweiter Hinweis: Vielleicht sollten Sie 'ReadToEnd()' einmal aufrufen und das Ergebnis in einer String-Variablen speichern ... –

+0

@JonSkeet Doh. Es ist mir peinlich, dass ich das nicht verstanden habe. – Carcigenicate

Antwort

4

Nein, es nicht außer Acht gelassen wird. Sie lesen alle Daten in Ihrem ersten if Block, indem Sie reader.ReadToEnd() aufrufen. Auf diese Weise sind keine weiteren Daten zum Lesen Ihrer else if-Anweisung verfügbar. Es gibt eine leere Zeichenfolge zurück. Somit stimmt die Bedingung nicht überein und der letzte else Block wird ausgeführt.

Ändern Sie den Code wie folgt. Beachten Sie die temporäre data Variable im unteren Code.

StreamReader reader = new StreamReader(response.GetResponseStream()); 
string data = reader.ReadToEnd();//Read the data in temp variable. 
//Use this variable to check the conditions further. 
if (data == "Changed") 
{ 
    //Your code here 
} 
else if (data == "Unassigned") 
{ 
    //Your code here 
} 
else 
{ 
    //Your code here 
} 
+0

Danke, das hat perfekt funktioniert :) – KjayCopper

+0

Ich werde, ich denke, es gibt einen Timer, da es mich einschränkt, es nach 2 Minuten zu akzeptieren – KjayCopper

2

Sie haben einen Fehler in Ihrer allgemeinen Logik. Wenn Sie die erste if-Anweisung eingeben, lesen Sie bis zum Ende des Streams mit dem Code reader.ReadToEnd(). In der nächsten Anweisung (else) lesen Sie den Stream erneut, aber er wurde bereits gelesen. Daher wird eine leere Zeichenfolge zurückgegeben, und somit wird die letzte else-Anweisung wirksam.

Sie können darüber auch auf MSDN lesen: StreamReader.ReadToEnd() Method.

Definition des Rückgabewertes:

Der Rest des Stroms als eine Zeichenfolge, von der aktuellen Position bis zum Ende. Wenn sich die aktuelle Position am Ende des Streams befindet, wird eine leere Zeichenfolge ("") zurückgegeben.

Der Code sollte wie folgt aussehen:

StreamReader reader = new StreamReader(response.GetResponseStream()); 
var result = reader.ReadToEnd(); 

if(result == "Changed") 
{ 
    label2.Visible = false; 
    button1.Enabled = false; 
    button2.Enabled = true; 
    button3.Enabled = true; 
    button4.Enabled = true; 
    button5.Enabled = true; 
    button6.Enabled = true; 
    button7.Enabled = true; 
    button8.Enabled = true; 
    timer1.Enabled = true; 
} 
else if(result == "Unassigned") 
{ 
    string message = "Error Code: [email protected]@Error booking [email protected] make sure you have been assigned to a [email protected]@If this error persists please contact K.McCrudden."; 
    message = message.Replace("@", "" + System.Environment.NewLine); 
    string title = "Error!"; 

    MessageBoxButtons buttons = MessageBoxButtons.OK; 
    DialogResult result = MessageBox.Show(message, title, buttons, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2); 
} 
else 
{ 
    string message = "Error Code: [email protected]@Error booking [email protected] make sure you have booked a shift and have been [email protected]@If this error persists please contact K.McCrudden."; 
    message = message.Replace("@", "" + System.Environment.NewLine); 
    string title = "Error!"; 

    MessageBoxButtons buttons = MessageBoxButtons.OK; 
    DialogResult result = MessageBox.Show(message, title, buttons, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2); 
}