Simple: the text box is not a date in a format that SQL can recognize. Remember, SQL Server doesn't often on the same computer that the application sending it data does (except in development) so it's Locale settings can be wildly different from the settings the User has specified and entered his data in.
Additionally, users make mistakes: they type dates wrong all the time!
The solution to both causes is the same, and is simple: validate and convert your dates when the user inputs them, and send them to SQL as DateTime values instead of strings. That way, the data sent is independent of the user preferences, and is guaranteed to be compatible between the two systems.
I'd also recommend that you write a helper method to reduce the clutter of that code:
cmd.Parameters.AddWithValue("@caption", SqlDbType.VarChar).Value = string.IsNullOrWhiteSpace(txtCaption.Text) ? DBNull.Value : (object)txtCaption.Text;
Is a lot harder to read than:
AddParameterValue(cmd, "@caption", txtCaption.Text);
and then sort out the text / null value in the helper. It's also much less prone to error ...