(Извините, сначала я не видел вашего ответа с просьбой о более легком способе, чем при ручном подключении к событиям Format/Parse, поэтому мой ответ, вероятно, не является достаточным, но для других людей, имеющих одну и ту же проблему, фрагмент кода может быть полезен.)
Вы можете использовать событие Format and Parse привязки этого TextBox для преобразования пустой строки в DBNull.Value и обратно, чтобы элемент управления был действительным, и вы можете оставить его.
// Call AllowEmptyValueForTextbox() for each TextBox during initialization.
void AllowEmptyValueForTextBox(TextBox textBox)
{
if (textBox.DataBindings["Text"] != null)
{
textBox.DataBindings["Text"].Format += OnTextBoxBindingFormat;
textBox.DataBindings["Text"].Parse += OnTextBoxBindingParse;
}
}
void OnTextBoxBindingParse(object sender, ConvertEventArgs e)
{
// Convert the value from the textbox to a value in the dataset.
string value = Convert.ToString(e.Value);
if (String.IsNullOrEmpty(value))
{
e.Value = DBNull.Value;
}
}
void OnTextBoxBindingFormat(object sender, ConvertEventArgs e)
{
// Convert the value from the dataset to a value in the textbox.
if (e.Value == DBNull.Value)
{
e.Value = String.Empty;
}
}
Вместо того чтобы показывать пользователю пустое текстовое поле, когда поле в наборе данных пуст, вы можете использовать один и тот же механизм, чтобы заполнить текстовое поле со строкой, как «(не установлено)» Орсо. В методе «Формат» преобразовать DBNull.Value в «(не задано)» и в методе Parse преобразовать его обратно.
Смотрите также: http://msdn.microsoft.com/en-us/library/system.windows.forms.binding.parse
возможно дубликат [Data переплете TextBox: не может выйти] (http://stackoverflow.com/questions/217912/data-bound-textbox-cant-exit) –
Люди уже голосуют, чтобы закрыть это как точный дубликат вопроса, с которым вы связались. Можете ли вы объяснить, как ваша проблема другая, и почему ответы на другой вопрос * не работали в вашем случае? –
CausesValidation имеет значение true, потому что это то, как я хочу его (мне нужно проверить целочисленный диапазон) - для параметра AutoValidate установлено значение EnablePreventFocusChange, что верно для реальной ошибки. Последний абзац указывает на правильное направление, но я должен ожидать, что поведение всегда должно быть одинаковым. Теперь я вручную добавил события Format и Parsing в класс Binding, но я не ожидал бы этого сделать для каждого поля с нулевым значением. Должен быть простой способ? – eiri