IIf - это вызов функции, а не истинный условный оператор, и это означает, что оба аргумента должны быть оценены. Таким образом, он просто пытается вызвать Integer.Parse (), если ваша строка имеет значение Null / Nothing.
Если вы используете Visual Studio 2008 или более позднюю версию, разница в одном символе может решить вашу проблему:
Foo = If(String.IsNullOrEmpty(txtFoo.Text), 0, Integer.Parse(txtFoo.Text.Trim())
Эта версия ключевого слова If
на самом деле является истинным условным оператором, который будет выполнять оценку аргументов при коротком замыкании, как и ожидалось.
Если вы используете Visual Studio 2005 или более раннюю версию, исправьте это следующим образом:
If String.IsNullOrEmpty(txtFoo.Text) Then Foo = 0 Else Foo = Integer.Parse(txtFoo.Text.Trim())