2017-07-17 8 views
1

ここは新しいです、私は正しい場所にいるといいですね。 誰でも助けてくれますか? 私のプログラムに3つのrichTextBoxがあります 最初のものは(datetime形式)です:日付の開始 2番目のものは(datetime形式):日付の最後 3番目のものは(Timespan形式):残っている日(richTextBox1から)日付(richTextBox2)。 richTextBox3 < = 0の場合、警告メッセージが表示されます。 しかし、私はアイテムをDoubleに変換する方法を知らない。 ありがとうございます。richtextbox(TimeSpan)のコンテンツをDoubleまたはFloatに変換してください。

マイコード:

// 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」は「StreamReader」です。 'StreamReader'を入力として受け取る' DateTime.Parse'のオーバーロードはありません。代わりに 'richTextBox1.Text'と置き換えるべきでしょうか? –

+0

なぜStreamReaderを使用しますか? –

+1

これを 'if(remainingDays.TotalDays <= 0)'に変更して、それがうまくいくかどうか確認してください。 –

答えて

1

この作業を行うにはいくつかのことがあります。

最初にStreamReaderオブジェクトを直接使用する必要はありません。静的File.ReadAllText()メソッドを使用すると、ファイルの内容を文字列変数に読み込むことができます。これは、ファイルを開き、テキストを読んで、それを返し、ファイルを閉じます。あなたのDateTime変数を設定するとき

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

次に、あなたはそれを文字列値ではなく、StreamReaderオブジェクトを渡したいです。我々はすでに我々RichTextBoxオブジェクト内の文字列を格納したので、私たちはそれらを使用することができます。

// 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); 

を次に、あなたが減算を行うとき、あなたは日数を表す取得するTimeSpanTotalDaysプロパティにアクセスすることができますrichTextBox3.Textをその値に設定します。

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

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

私は多少混乱していますが、 '(dateEnding - dateStarting).TotalDays'の結果をintとして保存してテキストボックスの値として使用し、フォームを保存するのが最善ではないでしょうか?パースする?または、あなたの例では、別々のスコープの2つのコードスニペットですか? – maccettura

+1

@maccetturaはい、そうです。私は例を更新しました。ありがとう! –

+0

ええ、それは私の場合は 'TryParse'を使用しますが、私の意見では直接質問に関連していない直交コードの束を追加します(DateTimeをparams、if/elseブロックなどに追加する)。 'endDate'が' startDate'よりも大きいことを保証するなど、入力を検証するために他にもできることがあります。私は既にコードで 'Parse'メソッドについてコメントしました。それが問題の原因になった場合、新しい質問をすることができます。 :) –

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

間違ってフォーマットされたデータは、このメソッドは例外をスローするようになります。直接的なユーザー入力を解析しようとしているので、これをtry-catchブロックにラップする必要があります。また、パフォーマンスについて懸念している場合はTryParseを使用することもできます。 TryParseメソッドは例外をスローしません。

+0

try-catchで解析するのは、 'TryParse()'を使うよりもはるかに遅いです。あなたは、通常、常にTryParse()を好むべきです。 – maccettura

+0

A.私の答えは間違っていない、それは好みの問題です。 B.性能の差は無視できる。 C.解析を試してみると、out変数をdelcareして使用する必要があります。さらに、OPがまだそれをやっていないので、TryParseを実行するために必要な余分のオーバーヘッドは、効率の低下とほぼ同じです。ユーザーはユーザー入力を検証し、予期しないことが発生した場合は例外をスローする必要があります。 – MBurnham

+0

例外をスローすることは、あなたができる最もパフォーマンスの良いものの1つです。 'TryParse()'は 'Parse()'より約36倍高速です。 36倍の増加は "無視できる"か?理由は、outパラメータを使用したくないからです。 – maccettura

関連する問題