I think your structure of the nested if statements is your first problem.
Validate the first number
Validate the second number
(There's no reason to validate the result since you're about to overwrite it!)
Then calculate the result based on the radio buttons. (There could be errors here! e.g. divide by zero or overflow)
Report result.
An exception is probably not what you want for the error handling, since from a button click handler, there's no good place outside the method to catch the exception. Instead, add a multiline Label or readonly TextBox control to display any error messages.
Not complete code, but something like:
private const string BadFirstNumber = "Bad first number";
private const string BadSecondNumber = "Bad second number";
private const string DivisionByZero = "Division by zero";
private const string NoOperationSelected = "No operation selected";
private const string NewLine = "\n";
private void btnCalculate_Click(object sender, EventArgs e)
{
double dFirstNumber;
double dSecondNumber;
double dResult;
List<string> messages = new List<string>();
bool success = true;
if (!double.TryParse(txtFirstNumber.Text, out dFirstNumber))
{
messages.Add(BadFirstNumber);
success = false;
}
if (!double.TryParse(txtSecondNumber.Text, out dSecondNumber))
{
messages.Add(BadSecondNumber);
}
if (success)
{
try
{
if (radAdd.Checked)
dResult = dFirstNumber + dSecondNumber;
else if (radSubtract.Checked)
dResult = dFirstNumber - dSecondNumber;
else if (...)
else
{
messages.Add(NoOperationSelected);
success = false;
}
}
catch (DivideByZeroException)
{
messages.Add(DivisionByZero);
}
catch (OverflowException)
{
messages.Add(ArithmeticOverflow);
}
if (success)
{
txtResult.Text = dResult.ToString("n1");
messages.Add(SuccessfulResult);
}
lblMessages.Text = string.Join(NewLine, messages);
}
}
There are other designs that would be better but this is a good start and not too different from where you are starting.