Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 удаление строк с подтверждением  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51543
маленькая тестовая задача
на форме DataGridView и BindingNavigator
Хочу обработать событие удаления строки, переспросить и при необходимости отменить удаление
Повесил обработчик Ref_meta_tables.RowDeleting += Row_Deleting
Внутри - безусловный пока вызов e.Row.RejectChanges()
Нажимаю кнопку "удалить" в BindingNavigator/е
Обработчик вызывается, мессадж выводится, но строка все равно удаляется


        private static void Row_Deleting(object sender,
            DataRowChangeEventArgs e)
        {
            e.Row.RejectChanges(); // как пишут, должен отменить удаление
            MessageBox.Show("ok");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.ref_meta_tablesTableAdapter.Fill(this.test_isolDataSet.Ref_meta_tables);
            this.test_isolDataSet.Ref_meta_tables.RowDeleting += Row_Deleting;


К сообщению приложен файл. Размер - 31Kb
5 сен 18, 08:08    [21664988]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4803
RejectChanges надо вызывать после удаления строки, в обработчике RowDeleting она еще не удалена, и отменять нечего.
Как-то вот так (только в поле уровня класса хранить ссылку на удаленный DataRow).
5 сен 18, 09:36    [21665101]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145595
А я по простому, по рабоче-крестьянски


private void Row_Deleting(object sender, DataRowChangeEventArgs e)
        {
            if (! ClassFunc.ConfirmDeleteRecord())
                throw new Exception();

        }

...

static public Boolean ConfirmDeleteRecord()
        {

            return (MessageBox.Show("Вы уверены, что запись надо удалить?", "Подтверждение",
                  MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
                      == DialogResult.Yes);
        }
5 сен 18, 10:10    [21665154]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51543
Cat2,

мне нравится
но ест вопрос
у меня по любому exception вываливается такая хрень
Как ее принято централизовано обрабатывать?

ЗЫ: в Делфи было специальное исключение - abort - и оно никуда не вываливалось пользователю

К сообщению приложен файл. Размер - 9Kb
5 сен 18, 10:59    [21665218]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51543
Сон Веры Павловны
RejectChanges надо вызывать после удаления строки, в обработчике RowDeleting она еще не удалена, и отменять нечего.
Как-то вот так (только в поле уровня класса хранить ссылку на удаленный DataRow).

так работает, но после отмены удаления переходит на следующую строку
        private static void Row_Deleting(object sender,
            DataRowChangeEventArgs e)
        {
            if (MessageBox.Show("Вы уверены, что запись надо удалить?", "Подтверждение",
                  MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
                      != DialogResult.Yes)
            {
                e.Row.RowError = "cancel delete";
            }
        }

        private static void Row_Deleted(object sender,
            DataRowChangeEventArgs e)
        {
            if (e.Row.RowError == "cancel delete")
            {
                e.Row.RejectChanges();
                e.Row.RowError = "";
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.ref_meta_tablesTableAdapter.Fill(this.test_isolDataSet.Ref_meta_tables);
            this.test_isolDataSet.Ref_meta_tables.RowDeleting += Row_Deleting;
            this.test_isolDataSet.Ref_meta_tables.RowDeleted  += Row_Deleted;
5 сен 18, 11:23    [21665265]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4803
В данном случае, наверное, чусше ловить попытки удалить строку на уровне UI - например, через DataGridView.UserDeletingRow.
5 сен 18, 12:33    [21665455]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51543
Сон Веры Павловны
В данном случае, наверное, чусше ловить попытки удалить строку на уровне UI - например, через DataGridView.UserDeletingRow.
мне это не нравится, потому как еще есть навигатор, а его события никак не связаны с гридом
5 сен 18, 13:21    [21665572]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4803
andreymx
Сон Веры Павловны
В данном случае, наверное, чусше ловить попытки удалить строку на уровне UI - например, через DataGridView.UserDeletingRow.
мне это не нравится, потому как еще есть навигатор, а его события никак не связаны с гридом

У него есть свои собственные способы контролировать манипуляции с данными: BindingNavigator.DeleteItem.
5 сен 18, 13:36    [21665614]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51543
Сон Веры Павловны
andreymx
пропущено...
мне это не нравится, потому как еще есть навигатор, а его события никак не связаны с гридом

У него есть свои собственные способы контролировать манипуляции с данными: BindingNavigator.DeleteItem.
считаю неверным на одно событие делать обработки в разных местах
а потом пользователь большую кнопку попросит - там тоже обрабатывать?
Хотелось бы одно место найти приложения усилий
5 сен 18, 13:50    [21665643]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51543
Коллеги, всем спасибо за варианты, у кого есть ещё, предлагайте, рассмотрю любые
5 сен 18, 14:29    [21665731]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
ViPRos
Member

Откуда:
Сообщений: 9530
andreymx,

удаление дорогая и сложная операция (особенно если есть связи в датасет), потому по возможности не надо ее допустить
так что надо отказ повесить на все кнопки и т.д. чтобы предотвратить удаление
5 сен 18, 14:38    [21665747]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145595
andreymx
Как ее принято централизовано обрабатывать?

Аварийных завершений не должно быть!
5 сен 18, 14:53    [21665783]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 51543
Cat2,
спасибо, буду смотреть



ViPRos
andreymx,
удаление дорогая и сложная операция (особенно если есть связи в датасет), потому по возможности не надо ее допустить
полностью согласен

ViPRos
так что надо отказ повесить на все кнопки и т.д. чтобы предотвратить удаление
полностью не согласен
5 сен 18, 15:43    [21665881]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
ViPRos
Member

Откуда:
Сообщений: 9530
andreymx
ViPRos
так что надо отказ повесить на все кнопки и т.д. чтобы предотвратить удаление
полностью не согласен

Ты можешь согласиться или нет, но придется, если будешь реально этим делом пользоваться
такие попытки/намерения надо обрубить в зародыше, до запуска процесса ("удаление", в данном случае)
5 сен 18, 15:58    [21665915]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 4803
andreymx
полностью не согласен

У винформсового DVG могут быть самые разные источники данных - например, реализации IList<T> (просто List<T>), у которого вообще нет никаких событий об изменении содержимого, и нет никаких никаких методов для отката таких изменений. И даже если его цеплять к DGV через BindingSource, то и это мало чем поможет. Поэтому в целях общности подхода я лично все такие проверки делаю на уровне UI, а не на уровне источника данных.
5 сен 18, 17:00    [21666016]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145595
Сон Веры Павловны, серебряную пулю отливаете?

Будет List, будем по другому.

private void saveToolStripButton_Click(object sender, EventArgs e)
        {
            solveDeleteRow();
        }
...

private void myDataGridView_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            solveDeleteRow();
        }

...
private void solveDeketeRow() {
           if (ConfirmDeleteRecord())
                myDataGridView.EndEdit();
            else 
                myDataGridView.CancelEdit();
}


=============
Для andreymx .

Выкиньте Вы bindingNavigator.

На основании длительных наблюдений над пользователями я выявил, что они не пользуются кнопками навигации. Им быстрее и привычнее прокрутить.

Единственные полезные кнопки - Удалить и Сохранить.
Лично мне удобнее сделать их как обычные кнопки, что бы не нужно было бороться с действиями по умолчанию кнопок навигатора.
5 сен 18, 18:53    [21666142]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145595
Ошибочка вышла
Cat2
private void deleteToolStripButton_Click(object sender, EventArgs e)
        {
            solveDeleteRow();
        }
...
5 сен 18, 18:55    [21666147]     Ответить | Цитировать Сообщить модератору
 Re: удаление строк с подтверждением  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145595
О черт! Без исходников под рукой
private void deleteToolStripButton_Click(object sender, EventArgs e)
{
if (ConfirmDeleteRecord()){
myBindingSource.RemoveCurrent();
myBindingSource.EndEdit();
}
}
5 сен 18, 20:17    [21666234]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить