2017-07-17 6 views
1

Ich bin neu hier, ich hoffe, ich bin am richtigen Ort. Kann mir jemand helfen? Ich habe 3 richTextBox in meinem Programm Die erste ist (Datetime Format): Datum Start Die 2sd ist (Datetime Format): Datum Ende Die dritte ist (Timespan Format): Bleibende Tage (von RichTextBox1) zum nächsten Datum (RichTextBox2). Was ich will ist, wenn richTextBox3 < = 0 Warnmeldung anzeigen. Aber ich weiß nicht, wie Sie Elemente in Double konvertieren. Vielen Dank im Voraus.Konvertiere den Inhalt von richtextbox (TimeSpan) in Double oder Float

Mein Code:

// Reading Text File 1. 
TextReader dateOfStart = new StreamReader (TextFilePath); 

richTextBox1.Text = dateOfStart.ReadToEnd(); 
dateOfStart.Close(); 

// Reading Text File 2. 
TextReader dateOfEnd = new StreamReader (TextFilePath); 

richTextBox2.Text = dateOfEnd.ReadToEnd(); 
dateOfEnd.Close(); 

// Convert to DateTime 1 
DateTime dateStarting = DateTime.Parse(dateOfStart); 

// Convert to DateTime 2 
DateTime dateEnding = DateTime.Parse(dateOfEnd); 

// Calc 
TimeSpan remainningDays = dateEnding - dateStarting; 

// if richTextBox3 <= Zero, launch Warninng. 
If (remainningDays <= 0) 
{ 
    MessageBox.Show (Warnning !!!!!); 
}  
+0

'dateOfStart' ist ein' StreamReader'. Es gibt keine Überladung von 'DateTime.Parse', die einen' StreamReader' als Eingabe benötigt. Vielleicht solltest du es stattdessen durch 'richTextBox1.Text' ersetzen? –

+0

Warum verwenden Sie einen StreamReader? –

+1

Ändern Sie es in 'if (restesDays.TotalDays <= 0)' und sehen Sie, ob das für Sie funktioniert. –

Antwort

1

Es gibt ein paar Dinge, die Sie tun können, damit das funktioniert.

Zuerst müssen Sie StreamReader Objekte nicht direkt verwenden, Sie können die statische Methode File.ReadAllText() verwenden, um den Inhalt einer Datei in eine Zeichenfolgevariable zu lesen. Dies wird die Datei öffnen, den Text lesen, zurückgeben und dann die Datei für Sie schließen.

richTextBox1.Text = File.ReadAllText(startDateFilePath); 
richTextBox2.Text = File.ReadAllText(endDateFilePath); 

Als nächstes, wenn Ihre DateTime Variablen einstellen, wollen Sie es den String-Wert zu übergeben, nicht die StreamReader Objekt.

// Note that `Parse` will throw an exception if the text is not a valid date 
// Use `TryParse` instead if this is a possibility, 
//  or use a `try/catch` block and catch the FormatException 
DateTime dateStarting = DateTime.Parse(richTextBox1.Text); 
DateTime dateEnding = DateTime.Parse(richTextBox2.Text); 

Wenn Sie dann die Subtraktion tun, können Sie die TotalDays Eigenschaft des TimeSpan Zugriff die Anzahl der Tage dargestellt zu bekommen: Da wir bereits die Zeichenfolge in unserem RichTextBox Objekte gespeichert haben, können wir diejenigen, benutzen Sie einfach und stellen Sie richTextBox3.Text auf diesen Wert ein:

double remainingDays = (dateEnding - dateStarting).TotalDays; 
richTextBox3.Text = remainingDays.ToString(); 

if (remainingDays <= 0) 
{ 
    MessageBox.Show("Warning !!!!!"); 
} 
+0

Ich bin etwas verwirrt, wäre es nicht das beste, das Ergebnis von '(dateEnding - dateStarting) .TotalDays' zu nehmen und es als int zu speichern, so dass Sie es als Textbox-Wert verwenden und speichern können Parsen? Oder waren diese zwei Codeschnipsel in Ihrem Beispiel in separaten Bereichen? – maccettura

+1

@maccettura Ja, das stimmt. Ich habe das Beispiel aktualisiert. Vielen Dank! –

+0

Ja, ich würde "Tryparse" verwenden, wenn es meiner wäre, aber das fügt meiner Meinung nach einen Haufen orthogonalen Code hinzu, der nicht direkt mit der Frage zusammenhängt (Hinzufügen der Parameter DateTime out, if/else usw.). Es gibt noch andere Dinge, die man auch tun könnte, um Eingaben zu validieren, zum Beispiel sicherzustellen, dass "endDate" größer ist als "startDate". Ich habe bereits einen Kommentar zur 'Parse'-Methode im Code gemacht. Wenn das ein Problem verursacht, kann er eine neue Frage stellen. :) –

-1
double myDoubleValue = Double.Parse(richTextBox3.Text); 

falsch formatierte Daten werden diese Verfahren verursachen eine Ausnahme zu werfen. Da Sie versuchen, direkte Benutzereingaben zu analysieren, sollten Sie dies in einen try-catch-Block einfügen. Wenn Sie sich um die Leistung sorgen, können Sie alternativ TryParse verwenden. Die Methode TryParse löst keine Ausnahme aus.

+0

Das Wrappen eines Parsers in einem try-catch ist viel langsamer als die Verwendung von 'TryParse()'. Sie sollten in der Regel bevorzugen 'TryParse()' – maccettura

+0

A. Meine Antwort ist nicht falsch, das ist eine Frage der Präferenz. B. Der Leistungsunterschied wäre vernachlässigbar. C. Versuchen Sie Parse erfordert, dass Sie delcare und verwenden Sie eine Variable out. Da OP dies nicht bereits getan hat, wird der zusätzliche Overhead, der für TryParse erforderlich ist, den Effizienzverlust nahezu ausgleichen. Der Benutzer sollte die Benutzereingabe überprüfen und eine Ausnahme auslösen, wenn etwas Unerwartetes auftritt. – MBurnham

+0

Throwing Exceptions sind eines der leistungsstärksten Dinge, die man machen kann, 'TryParse()' ist ~ 36x schneller als 'Parse()'. Ist ein 36x Anstieg "vernachlässigbar"? Der Grund dafür ist, dass Sie keinen out-Parameter verwenden möchten. – maccettura

Verwandte Themen