Binding перехватывает все исключения!?!?!
От: Oberezhinskiy  
Дата: 19.11.04 11:13
Оценка:
Доброго времени суток!

Столкнулся со следующей проблемой
Есть TextBox, делаю
TextBox textBox;
textBox.DataBindings.Add("Text", ToolDT, "Name");

Все прекрасно биндится!
Потом определяю обработчик события изменения колонки "Name" и делаем в нем throw new Exception();.Сообщение об ошибке не появляется, фокус остается на контроле и сменить фокус не возможно.

В дизасемблере отдебажили бросание исключения и наткнулись на метод в объекте System.Windows.Forms.Binding

private void Target_Validate(object sender, CancelEventArgs e)
{
      try
      {
            this.PullData();
      }
      catch (Exception)
      {
            e.Cancel = true;
      }
}


И мне кажется, что MS must die


Есть ли мысли, как можно бросать исключения в обработчиках изменений прибинденых колонок!


19.11.04 14:30: Перенесено модератором из '.NET' — TK
Binding перехватывает все исключения!?!?!
От: Аноним  
Дата: 19.11.04 11:22
Оценка:
а в каких случаях вам нужны исключения биндинга?

если для проверки валидности валидности введенных значений, то этоможно сделать до байндинга, в Validating.
Alexandr V. Merkulyev


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Binding перехватывает все исключения!?!?!
От: Oberezhinskiy  
Дата: 19.11.04 11:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>а в каких случаях вам нужны исключения биндинга?


А>если для проверки валидности валидности введенных значений, то этоможно сделать до байндинга, в Validating.


А>
данное сообщение получено с www.gotdotnet.ru

А>ссылка на оригинальное сообщение


Исключения нужны именно для проверки валидности! Нельзя ли подробнее,у кого событие Validating ??
Re: Binding перехватывает все исключения!?!?!
От: Аноним  
Дата: 19.11.04 11:53
Оценка:
у контрола, у того же TextBox есть событие Validating и Validated, второе вызывается только если первое отработало нормально.
а что бы первое отработало не нормально, достаточно написать, ааа, вот и примерный код:

protected virtual void textBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
if (textBox.Text != "123")
{
e.Cancel = true;
MessageBox.Show("Неверные данные!" , "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
Alexandr V. Merkulyev


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Binding перехватывает все исключения!?!?!
От: Аноним  
Дата: 19.11.04 11:57
Оценка:
Исключения нужны именно для проверки валидности! Нельзя ли подробнее, у кого есть событие Validating ??

Если у контрола, то это нам не подходит, мы хотели валидировать централизовано в момент изменения данных!
С уважением,
Бережинский Олег.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Binding перехватывает все исключения!?!?!
От: Аноним  
Дата: 19.11.04 11:58
Оценка:
а что значит централизовано?
и интересно так же, в какой такой момент изменения данных?
Alexandr V. Merkulyev


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Binding перехватывает все исключения!?!?!
От: Аноним  
Дата: 19.11.04 12:11
Оценка:
Хочется не думать при создании вин форм о валидации.
Мы планировали повесить валидацию на изменение занечения в DataRow, если валидация не походит, мы кидаем исключение!
С уважением,
Бережинский Олег.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: Binding перехватывает все исключения!?!?!
От: Аноним  
Дата: 19.11.04 12:17
Оценка:
Извините, на какое именно событие DataRow вы хотите повесить проверку валидации?
Alexandr V. Merkulyev


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: Binding перехватывает все исключения!?!?!
От: Oberezhinskiy  
Дата: 19.11.04 12:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Извините, на какое именно событие DataRow вы хотите повесить проверку валидации?


А>
данное сообщение получено с www.gotdotnet.ru

А>ссылка на оригинальное сообщение


Не на событии Datarow вешаем обработчик, а на событие изменения DataColumn в DataTable.(ColumnChanged ColumnChanging)
Re[2]: Binding перехватывает все исключения!?!?!
От: Syffest Россия  
Дата: 19.11.04 12:40
Оценка:
Здравствуйте, Вы писали:

А>у контрола, у того же TextBox есть событие Validating и Validated, второе вызывается только если первое отработало нормально.

А>а что бы первое отработало не нормально, достаточно написать, ааа, вот и примерный код:

Так любой может. Хотелось что бы типизированная таблица сама чекала бизнеслогику. И вроде все клёво получилось бы если бы биндинг не жрал исключения.
Re[2]: Binding перехватывает все исключения!?!?!
От: Аноним  
Дата: 19.11.04 12:52
Оценка:
угу, вы только представьте себе содержимое общего кода проверки для всех полей таблицы, в нем же потом сам черт ногу сломит
Alexandr V. Merkulyev


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Binding перехватывает все исключения!?!?!
От: Syffest Россия  
Дата: 19.11.04 13:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>угу, вы только представьте себе содержимое общего кода проверки для всех полей таблицы, в нем же потом сам черт ногу сломит


А>
данное сообщение получено с www.gotdotnet.ru

А>ссылка на оригинальное сообщение


Прекрасно представляю, более того он у нас отчасти уже написан и работает и всё очень прозрачно и понятно, только одна проблема, сообщение об ошибке не выводится, а просто фокус остается на контроле до тех пор пока в этом контроле не окажутся корректные данные.

А теперь вы представьте что с этой таблицей в той или иной мере работает скажем три разных клиентских приложения скажем Виндовый клиент, Веб клиент и какой-нибудь сервис например... и в каждом из них придется тогда писать свою валидацию, и так же для каждого из полей. Это имхо гораздо сложнее.
Re[3]: Binding перехватывает все исключения!?!?!
От: Oberezhinskiy  
Дата: 19.11.04 13:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>угу, вы только представьте себе содержимое общего кода проверки для всех полей таблицы, в нем же потом сам черт ногу сломит


А>
данное сообщение получено с www.gotdotnet.ru

А>ссылка на оригинальное сообщение


Это еще почему?!?! спорно
Мы хотели сделать валидаторы, которые подключаются к типизированным таблицам.
Валидаторов на одной таблице может быть сколько угодно!!
Re[3]: Binding перехватывает все исключения!?!?!
От: Аноним  
Дата: 19.11.04 13:16
Оценка:
Есть и другой путь, сделать проверку при записи в свойство, то есть если каждое поле таблицы определить как свойство с соответствующими методами set & get, и проверку делать в методе get, то все будет еще более красившее))
Alexandr V. Merkulyev


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Binding перехватывает все исключения!?!?!
От: Syffest Россия  
Дата: 19.11.04 13:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть и другой путь, сделать проверку при записи в свойство, то есть если каждое поле таблицы определить как свойство с соответствующими методами set & get, и проверку делать в методе get, то все будет еще более красившее))


Не проверял, но более чем уверен, что тоже не будет работать. Так если натравливать биндинг на эти свойства, то момент присвоения им значений, тоже будет происходить в злополучном блоке try{}catch(){}, голову бы оторвать тому программеру который писал этот биндинг. Так что видимо либо придумывать как делать валидацию на контролах, либо отказываться от биндинга, либо... либо сделать какой-то класс разводку который в зависимости от настроек приложения вызывает в блоке валидации:

a)MessageBox.Show()(скажем в виндовом клиенте);
b)trow new Exception();(в случаях когда биндинг не используется, например при работе сервиса)
c) разное...

Будем думать.
Re[5]: Binding перехватывает все исключения!?!?!
От: AlexandrV  
Дата: 19.11.04 13:34
Оценка:
Здравствуйте, 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>Есть ли мысли, как можно бросать исключения в обработчиках изменений прибинденых колонок!


Ситуация аналогичная, токо контролы биндятся на реквизиты доменного объекта, и при присвоении в реквизит там внутри может быть куча бизнес-логики провреяюще корректность присвоения и делающей ещё много телодвижений. То есть доменный объект при изменении реквизита знает что делать. Интерфейс незнает и нагружать его этим знанием небудем.

Уперся в аналогичную проблему с биндингом, что если при присвоении в свойство истоника данных биндинга, биндинг ошибку глотает (что плохо, т.к. у пользователя нет никакой информации что нет так) и фокус остается на контроле (что хорошо).
... есть ли решение этой проблемы на текущий момент?...

С Уважением, Павел.
Re: Binding перехватывает все исключения!?!?!
От: Gremlin2 http://www.fb2library.net/
Дата: 02.09.09 15:43
Оценка: 6 (1) +1
Здравствуйте, 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);
}
Re[2]: Binding перехватывает все исключения!?!?!
От: _FRED_ Черногория
Дата: 02.09.09 15:59
Оценка: 12 (1)
Здравствуйте, Аноним, Вы писали:

O>>Есть ли мысли, как можно бросать исключения в обработчиках изменений прибинденых колонок!


А>Ситуация аналогичная, токо контролы биндятся на реквизиты доменного объекта, и при присвоении в реквизит там внутри может быть куча бизнес-логики провреяюще корректность присвоения и делающей ещё много телодвижений. То есть доменный объект при изменении реквизита знает что делать. Интерфейс незнает и нагружать его этим знанием небудем.


А>... есть ли решение этой проблемы на текущий момент?...

Если в гугле набрать Binding Error Handling то у меня самой первой оказывается ссылка на статью Handling Windows Forms Data Binding Errors

Ошибки биндинг глотает, но сообщает о них через свои механизмы, которые надо явно подключить.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Binding перехватывает все исключения!?!?!
От: DmitryMS  
Дата: 02.09.09 16:32
Оценка:
Это плохая идея, использовать исключения длай сообшений о валиданости воода. Даже я так не делаю.
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>


Спасибо! то что нужно
С Уважением, Павел.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.