Mi associo, gli input incontrollati sono la fonte principale di errori nei programmi, e ci sono vari metodi per controllarli.
Nel caso di una conversione da stringa a numero, te ne propongo una, che ti ripara dai guai anche se l'utente scrive lettere invece di numeri:
EDIT: aggiunte info su CultureInfo
private void btn_messagebox_Click(object sender, EventArgs e)
{
double basemagg = 0;
double basemin = 0;
double altezza = 0;
string Messaggio = "";
// TryParse, tenta la conversione e deposita il risultato nella variabile specificata in out
// se la conversione va a buon fine la funzione restituisce true
// Aggiungendo: using System.Globalization; si può usare CultureInfo.
// CultureInfo, se omesso sarà quella del S.O in uso, attenzione ai punti decimali e virgole decimali
// in un S.O. con CultureInfo "it-IT" viene accettata la virgola decimale,
// se nella Text viene digitato 10,2 verrà convertito in 10.2 (corretto)
// se nella Text viene digitato 10.2 verrà interpretato come 102
// Forzando la CultureInfo in "en-US"
// se nella Text viene digitato 10.2 verrà convertito in 10.2 (corretto)
// se nella Text viene digitato 10,2 verrà interpretato come 102
// Esempio di conversione con una CultrueInfo specifica
// if (double.TryParse(txt_basemagg.Text, NumberStyles.Any, new CultureInfo("en-US"), out basemagg) == true)
// Conversione con CultureInfo omesso, viene usata quella del S.O.
if (double.TryParse(txt_basemagg.Text, out basemagg) == true)
{
txt_basemagg.Text = basemagg.ToString(); // mostra il risultato della conversione
}
else
{
Messaggio = "Base Maggiore, ";
}
if (double.TryParse(txt_basemin.Text, out basemin) == true)
{
txt_basemin.Text = basemin.ToString(); // mostra il risultato della conversione
}
else
{
Messaggio += "Base minore, ";
}
if (double.TryParse(txt_h.Text, out altezza) == true)
{
txt_h.Text = altezza.ToString(); // mostra il risultato della conversione
}
else
{
Messaggio += "Altezza, ";
}
if (Messaggio == "") // tutte le conversioni hanno avuto buon fine.
{
double area;
double perimetro;
double p;
double lato;
p = (basemagg - basemin) / 2;
lato = Math.Sqrt((p * p) + (altezza * altezza));
perimetro = basemagg + basemin + (lato * 2);
area = (basemagg + basemin) * altezza / 2;
MessageBox.Show("Perimetro = " + Math.Round(perimetro, 2) + "M" + Environment.NewLine + "Area = " + area + "M^2");
}
else
{
MessageBox.Show(Messaggio + "non compilato o valore errato");
}
}