2011-01-07 1 views
4

У меня такая же проблема, как и у this post. Он вызван bij числовым значением NULL для моего объекта набора данных. Когда свойство этого объекта имеет начальное значение null, я могу выйти из своего текстового поля. Когда мое текстовое поле имеет начальное числовое значение и очищает текстовое поле, я не могу выйти.Текстовое поле для привязки данных не может выйти

Я хочу иметь возможность указать нулевое значение, очистив текстовое поле. Я знаю, что это важная проблема, когда для свойства «CausesValidating» значение false, я могу выйти. Также моя функция настройки свойств никогда не достигается.

Любые идеи или предложения? Спасибо заранее!

+0

возможно дубликат [Data переплете TextBox: не может выйти] (http://stackoverflow.com/questions/217912/data-bound-textbox-cant-exit) –

+0

Люди уже голосуют, чтобы закрыть это как точный дубликат вопроса, с которым вы связались. Можете ли вы объяснить, как ваша проблема другая, и почему ответы на другой вопрос * не работали в вашем случае? –

+0

CausesValidation имеет значение true, потому что это то, как я хочу его (мне нужно проверить целочисленный диапазон) - для параметра AutoValidate установлено значение EnablePreventFocusChange, что верно для реальной ошибки. Последний абзац указывает на правильное направление, но я должен ожидать, что поведение всегда должно быть одинаковым. Теперь я вручную добавил события Format и Parsing в класс Binding, но я не ожидал бы этого сделать для каждого поля с нулевым значением. Должен быть простой способ? – eiri

ответ

4

(Извините, сначала я не видел вашего ответа с просьбой о более легком способе, чем при ручном подключении к событиям 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

+0

Было очень полезно для меня, спасибо, спасибо! – GoRoS

Смежные вопросы