Reputation: 557
Thanks guys for helping me to fix the 1 digit and >31 problems.
Now, one last thing... if a textbox has non-numeric characters or no characters at all, the program will crash.
here's the whole code:
private void generate_Click(object sender, EventArgs e)
{
int val = 0;
if (Int32.TryParse(dd.Text, out val))
{
if (val > 31) return;
else if (dd.Text.Length <= 1)
return;
}
if (Int32.TryParse(MM.Text, out val))
{
if (val > 31) return;
else if (MM.Text.Length <= 1)
return;
}
if (Int32.TryParse(hh.Text, out val))
{
if (val > 31) return;
else if (hh.Text.Length <= 1)
return;
}
if (Int32.TryParse(M.Text, out val))
{
if (val > 31) return;
else if (M.Text.Length <= 1)
return;
}
if (Int32.TryParse(ss.Text, out val))
{
if (val > 31) return;
else if (ss.Text.Length <= 1)
return;
}
String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text;
DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture);
long ticks = timestamp.Ticks;
long microseconds = ticks / 10;
convertedText.Text = microseconds.ToString("X");
}
What shall I put? I know it's a bit messy... but it works and it's my first C# application :P Thanks again!
Upvotes: 2
Views: 387
Reputation: 11615
I would guess its your ParseExact
crashing this...But I'm not totally sure... Wrap everything in a try catch or several try catches. Then you can see what's going on and correct it...
Something like:
try{
//Parse something...
}catch(Exception ex)
{
throw ex; //I usually put a break point here when I'm debugging...
}
Upvotes: 0
Reputation: 171569
If you are just going to return if the date does not parse, then you can skip all of the validation code and just use TryParseExact
:
private void generate_Click(object sender, EventArgs e)
{
String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text;
DateTime timestamp
if (!DateTime.TryParseExact(dateString, "yyyyddMMhhmmss", null,
DateTimeStyles.None, out timestamp ))
return;
long ticks = timestamp.Ticks;
long microseconds = ticks / 10;
convertedText.Text = microseconds.ToString("X");
}
Upvotes: 5
Reputation: 18306
It would crash on ParseExact
if dateString
is not in the correct format.
Use TryParseExact
instead.
Upvotes: 0
Reputation: 16529
Will this solve your particular problem? you're doing TryParsing and then validating the integer with greater than 31 or less than 1 but not handling if the TryParse fails.
private void generate_Click(object sender, EventArgs e)
{
int val = 0;
if (Int32.TryParse(dd.Text, out val))
{
if (val > 31) return;
else if (dd.Text.Length <= 1)
return;
}
else
{
return;
}
if (Int32.TryParse(MM.Text, out val))
{
if (val > 31) return;
else if (MM.Text.Length <= 1)
return;
}
else
{
return;
}
if (Int32.TryParse(hh.Text, out val))
{
if (val > 31) return;
else if (hh.Text.Length <= 1)
return;
}
else
{
return;
}
if (Int32.TryParse(M.Text, out val))
{
if (val > 31) return;
else if (M.Text.Length <= 1)
return;
}
else
{
return;
}
if (Int32.TryParse(ss.Text, out val))
{
if (val > 31) return;
else if (ss.Text.Length <= 1)
return;
}
else
{
return;
}
String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text;
DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture);
long ticks = timestamp.Ticks;
long microseconds = ticks / 10;
convertedText.Text = microseconds.ToString("X");
}
Upvotes: 0
Reputation: 115538
For starters, wrap your code in a try catch block. It will prevent the exception from automatically crashing the program. You can catch the exception and notify the user there is a problem with the input.
Then you can do something like:
catch
{
MessageBox.Show("Please enter numbers only.");
}
Really in a production app, you'd want to do a little more like catch a specific type of error. But for starting out this will do just fine.
Upvotes: 2