Столкнулся со следующей проблемой
Есть TextBox, делаю
TextBox textBox;
textBox.DataBindings.Add("Text", ToolDT, "Name");
Все прекрасно биндится!
Потом определяю обработчик события изменения колонки "Name" и делаем в нем throw new Exception();.Сообщение об ошибке не появляется, фокус остается на контроле и сменить фокус не возможно.
В дизасемблере отдебажили бросание исключения и наткнулись на метод в объекте System.Windows.Forms.Binding
Здравствуйте, Аноним, Вы писали:
А>а в каких случаях вам нужны исключения биндинга?
А>если для проверки валидности валидности введенных значений, то этоможно сделать до байндинга, в Validating.
А>данное сообщение получено с www.gotdotnet.ru А>ссылка на оригинальное сообщение
Исключения нужны именно для проверки валидности! Нельзя ли подробнее,у кого событие Validating ??
Re: Binding перехватывает все исключения!?!?!
От:
Аноним
Дата:
19.11.04 11:53
Оценка:
у контрола, у того же TextBox есть событие Validating и Validated, второе вызывается только если первое отработало нормально.
а что бы первое отработало не нормально, достаточно написать, ааа, вот и примерный код:
Хочется не думать при создании вин форм о валидации.
Мы планировали повесить валидацию на изменение занечения в DataRow, если валидация не походит, мы кидаем исключение!
Здравствуйте, Аноним, Вы писали:
А>Извините, на какое именно событие DataRow вы хотите повесить проверку валидации?
А>данное сообщение получено с www.gotdotnet.ru А>ссылка на оригинальное сообщение
Не на событии Datarow вешаем обработчик, а на событие изменения DataColumn в DataTable.(ColumnChanged ColumnChanging)
Здравствуйте, Вы писали:
А>у контрола, у того же TextBox есть событие Validating и Validated, второе вызывается только если первое отработало нормально. А>а что бы первое отработало не нормально, достаточно написать, ааа, вот и примерный код:
Так любой может. Хотелось что бы типизированная таблица сама чекала бизнеслогику. И вроде все клёво получилось бы если бы биндинг не жрал исключения.
Re[2]: Binding перехватывает все исключения!?!?!
От:
Аноним
Дата:
19.11.04 12:52
Оценка:
угу, вы только представьте себе содержимое общего кода проверки для всех полей таблицы, в нем же потом сам черт ногу сломит
Здравствуйте, Аноним, Вы писали:
А>угу, вы только представьте себе содержимое общего кода проверки для всех полей таблицы, в нем же потом сам черт ногу сломит
А>данное сообщение получено с www.gotdotnet.ru А>ссылка на оригинальное сообщение
Прекрасно представляю, более того он у нас отчасти уже написан и работает и всё очень прозрачно и понятно, только одна проблема, сообщение об ошибке не выводится, а просто фокус остается на контроле до тех пор пока в этом контроле не окажутся корректные данные.
А теперь вы представьте что с этой таблицей в той или иной мере работает скажем три разных клиентских приложения скажем Виндовый клиент, Веб клиент и какой-нибудь сервис например... и в каждом из них придется тогда писать свою валидацию, и так же для каждого из полей. Это имхо гораздо сложнее.
Здравствуйте, Аноним, Вы писали:
А>угу, вы только представьте себе содержимое общего кода проверки для всех полей таблицы, в нем же потом сам черт ногу сломит
А>данное сообщение получено с www.gotdotnet.ru А>ссылка на оригинальное сообщение
Это еще почему?!?! спорно
Мы хотели сделать валидаторы, которые подключаются к типизированным таблицам.
Валидаторов на одной таблице может быть сколько угодно!!
Re[3]: Binding перехватывает все исключения!?!?!
От:
Аноним
Дата:
19.11.04 13:16
Оценка:
Есть и другой путь, сделать проверку при записи в свойство, то есть если каждое поле таблицы определить как свойство с соответствующими методами set & get, и проверку делать в методе get, то все будет еще более красившее))
Здравствуйте, Аноним, Вы писали:
А>Есть и другой путь, сделать проверку при записи в свойство, то есть если каждое поле таблицы определить как свойство с соответствующими методами set & get, и проверку делать в методе get, то все будет еще более красившее))
Не проверял, но более чем уверен, что тоже не будет работать. Так если натравливать биндинг на эти свойства, то момент присвоения им значений, тоже будет происходить в злополучном блоке try{}catch(){}, голову бы оторвать тому программеру который писал этот биндинг. Так что видимо либо придумывать как делать валидацию на контролах, либо отказываться от биндинга, либо... либо сделать какой-то класс разводку который в зависимости от настроек приложения вызывает в блоке валидации:
a)MessageBox.Show()(скажем в виндовом клиенте);
b)trow new Exception();(в случаях когда биндинг не используется, например при работе сервиса)
c) разное...
Здравствуйте, Syffest, Вы писали:
S>Здравствуйте, Аноним, Вы писали:
А>>Есть и другой путь, сделать проверку при записи в свойство, то есть если каждое поле таблицы определить как свойство с соответствующими методами set & get, и проверку делать в методе get, то все будет еще более красившее))
S>Не проверял, но более чем уверен, что тоже не будет работать. Так если натравливать биндинг на эти свойства, то момент присвоения им значений, тоже будет происходить в злополучном блоке try{}catch(){}, голову бы оторвать тому программеру который писал этот биндинг. Так что видимо либо придумывать как делать валидацию на контролах, либо отказываться от биндинга, либо... либо сделать какой-то класс разводку который в зависимости от настроек приложения вызывает в блоке валидации:
S>a)MessageBox.Show()(скажем в виндовом клиенте); S>b)trow new Exception();(в случаях когда биндинг не используется, например при работе сервиса) S>c) разное...
S>Будем думать.
точно, совсем забыл, я сам недавно с этим боролся, впрочем не то что бы боролся, а так кое-что исследовал, и остановилсz на том, что вызов функции валидатинга лучше делать в соответствующем событии контрола, то есть в Validating, а вот метод валидатинга, может находится, для вашего случая в типизированной таблице, и код может выглядеть примерно так:
protected virtual void textBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
try
{
table.Validate_SomeProperty(textBox.Text);
}
catch(YourException ee)
{
e.Cancel = true;
errorProvider.SetError((Control)sender,ee.Message);
}
}
Re: Binding перехватывает все исключения!?!?!
От:
Аноним
Дата:
02.09.09 13:49
Оценка:
Здравствуйте, Oberezhinskiy, Вы писали:
O>Есть ли мысли, как можно бросать исключения в обработчиках изменений прибинденых колонок!
Ситуация аналогичная, токо контролы биндятся на реквизиты доменного объекта, и при присвоении в реквизит там внутри может быть куча бизнес-логики провреяюще корректность присвоения и делающей ещё много телодвижений. То есть доменный объект при изменении реквизита знает что делать. Интерфейс незнает и нагружать его этим знанием небудем.
Уперся в аналогичную проблему с биндингом, что если при присвоении в свойство истоника данных биндинга, биндинг ошибку глотает (что плохо, т.к. у пользователя нет никакой информации что нет так) и фокус остается на контроле (что хорошо).
... есть ли решение этой проблемы на текущий момент?...
Здравствуйте, Oberezhinskiy, Вы писали:
O>Доброго времени суток!
O>Столкнулся со следующей проблемой O>Есть TextBox, делаю O>TextBox textBox; O>textBox.DataBindings.Add("Text", ToolDT, "Name");
O>Все прекрасно биндится! O>Потом определяю обработчик события изменения колонки "Name" и делаем в нем throw new Exception();.Сообщение об ошибке не появляется, фокус остается на контроле и сменить фокус не возможно.
O>И мне кажется, что MS must die
Да что-же вы все такие нервные то, а?
Вызов textBox.DataBindings.Add(...) возвращает объект типа Binding, у которого есть замечательное событие BindingComplete. Подписавшись на которое можно получить информацию о возникшем исключении:
// Handle the BindingComplete event to catch errors and
// exceptions in binding process.void textBoxBinding_BindingComplete(object sender,
BindingCompleteEventArgs e)
{
if (e.BindingCompleteState != BindingCompleteState.Success)
MessageBox.Show("textBoxBinding: " + e.ErrorText);
}
Здравствуйте, Аноним, Вы писали:
O>>Есть ли мысли, как можно бросать исключения в обработчиках изменений прибинденых колонок!
А>Ситуация аналогичная, токо контролы биндятся на реквизиты доменного объекта, и при присвоении в реквизит там внутри может быть куча бизнес-логики провреяюще корректность присвоения и делающей ещё много телодвижений. То есть доменный объект при изменении реквизита знает что делать. Интерфейс незнает и нагружать его этим знанием небудем.
… А>... есть ли решение этой проблемы на текущий момент?...
Это плохая идея, использовать исключения длай сообшений о валиданости воода. Даже я так не делаю.
Re[2]: Binding перехватывает все исключения!?!?!
От:
Аноним
Дата:
03.09.09 05:41
Оценка:
Здравствуйте, Gremlin2, Вы писали:
G>Вызов textBox.DataBindings.Add(...) возвращает объект типа Binding, у которого есть замечательное событие BindingComplete. Подписавшись на которое можно получить информацию о возникшем исключении:
G>
G>// Handle the BindingComplete event to catch errors and
G>// exceptions in binding process.
G>void textBoxBinding_BindingComplete(object sender,
G> BindingCompleteEventArgs e)
G>{
G> if (e.BindingCompleteState != BindingCompleteState.Success)
G> MessageBox.Show("textBoxBinding: " + e.ErrorText);
G>}
G>