Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified? / 14 сообщений из 14, страница 1 из 1
20.04.2015, 12:20
    #38940477
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
Добрый день,

Создал тестовую форму. Поместил на нее DataGridView и ToolStrip с кнопкой "Save"
Код формы ниже.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
    public partial class TestForm7 : Form
    {
        BindingSource bs;
        DataTable dt;
        SqlDataAdapter da;
        SqlCommandBuilder cb;

        public TestForm7()
        {
            InitializeComponent();
        }

        private void TestForm7_Load(object sender, EventArgs e)
        {
            da = new SqlDataAdapter("select * from Bills", AppConnections.GetSqlConnection());
            dt = new DataTable("Bills");
            cb = new SqlCommandBuilder(da);
            da.Fill(dt);
            bs = new BindingSource();
            bs.DataSource = dt;
            dataGridView1.DataSource = bs;
        }

        private void toolStripButtonSave_Click(object sender, EventArgs e)
        {
            DataRow dr = ((DataRowView)bs.Current).Row;
            DataGridViewCell currentCell = dataGridView1.CurrentCell as DataGridViewCell;
            if (currentCell.IsInEditMode)
            {
                dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
            }
            bs.EndEdit();
            da.Update(dt);
            dr.AcceptChanges();
        }
    }



По умолчанию редактируемая строка грида возвращается в исходное состояние, если будет нажат ESC.

В тестовой форме, в общем-то, поведение по умолчанию воспроизводится. Но не всегда.

Следующая последовательность действий определяет понятное мне поведение грида, а именно:
- перейти на какую-либо запись, сделав ее текущей
- внести новое значение в целевую ячейку, например, "aaa"
- нажать на кнопку "Save"(запись будет сохранена как в источнике данных, так и на сервере)
- перейти на другую запись, сделав ее текущей
- внести новое значение в целевую ячейку, например, "sss"
- перейти на другую ячейку, не меняя текущей строки
- нажать ESC.
В результате нажатия значение в целевой ячейке сбросится с "sss" на исходное "aaa"

Если выполнять описанную последовательность многократно, то все будет работать так, как я описал. Главное, каждый раз после сохранения записи сменить текущую запись, тогда вопросов нет.

Следующая последовательность действий вызывает у меня вопросы, а именно:
- перейти на какую-либо запись, сделав ее текущей
- внести новое значение в целевую ячейку, например, "aaa"
- нажать на кнопку "Save"(запись будет сохранена как в источнике данных, так и на сервере)
- не меняя текущей строки изменить значение в текущей ячейке на "sss"
- перейти на другую ячейку, не меняя текущей строки
- нажать ESC.

В этот момент я ожидаю, что значение в ячейке вернется к исходному "aaa", однако, на самом деле, сколько бы раз я не жал ESC, значение в ячейке не изменится, оставаясь равным "sss". По непонятной мне причине значение свойства Row.State на шаге выделенном красным изменится с Unchanged на Modified.

Собственно вопрос - почему? И самое главное, как избежать этого? Мне нужно продуцировать поведение по умолчанию, когда при нажатии ESC строка будет приведена в исходное состояние.

Буду благодарен за комментарии.
...
Рейтинг: 0 / 0
21.04.2015, 01:41
    #38941180
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
строка dr.AcceptChanges(); избыточна
Но это ничего не меняет. Проблема существует.

Были подобные обсуждения или нет? Я ничего не нашел.
...
Рейтинг: 0 / 0
21.04.2015, 11:41
    #38941427
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
Жаль, что нет диалога.

По идее не я один должен был в это упереться.
Может сохранение записи при работе с DataGridView лучше организовать по другому?
...
Рейтинг: 0 / 0
21.04.2015, 12:38
    #38941494
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
Вакшуль СергейПо непонятной мне причине значение свойства Row.State на шаге выделенном красным изменится с Unchanged на Modified.А чего тут непонятного? Изменили значение в ячейке - изменилась строка.
...
Рейтинг: 0 / 0
21.04.2015, 13:41
    #38941561
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
skyANAА чего тут непонятного? Изменили значение в ячейке - изменилась строка.

ну смотрите.
(пишу по памяти, Visual Studio сейчас перед глазами нет)

Перед началом редактирования строки:
dr.RowState = Unchanged
dr.HasVersion(DataRowVersion.Proposed) = false

вносим изменение в ячейку, но не покидаем ее. Ячейка в состоянии редактирования, состояние строки то же:
dr.RowState = Unchanged
dr.HasVersion(DataRowVersion.Proposed) = false

зафиксируем изменения в ячейке:
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
получаем:
dr.RowState = Unchanged
dr.HasVersion(DataRowVersion.Proposed) = true

фиксируем изменения в строке:
bs.EndEdit()
получаем:
dr.RowState = Modified
dr.HasVersion(DataRowVersion.Proposed) = false

отсылаем изменения на сервер:
da.Update(dt);
получаем:
dr.RowState = Unchanged
dr.HasVersion(DataRowVersion.Proposed) = false

Дальше не сходя с той же строки и не покидая ячейку(хотя ячейку можно и покинуть, это не повлияет. Главное не менять текущую строку), снова вносим изменения в ячейку. Если не прекращая редактирование ячейки опросить состояния, получим:
dr.RowState = Unchanged
dr.HasVersion(DataRowVersion.Proposed) = false

А теперь самое главное - перенесем мышкой фокус на соседнюю ячейку, не меняя текущей строки . Получим:
dr.RowState = Modified

а ожидаемые значения должны быть те, что и раньше в аналогичной ситуации(выделены голубым):
dr.RowState = Unchanged
dr.HasVersion(DataRowVersion.Proposed) = true

skyANAА чего тут непонятного? Изменили значение в ячейке - изменилась строка.

Состояние строки изменилось с Unchanged на Modified. Разве это нормально?

Если перед этим не выполнять сохранение кнопкой Save, то в аналогичной ситуации(при завершении редактирования одной ячейки и переходе к другой ячейки той же строки) состояние строки не будет меняться и останется Unchanged.

Если перед этим все-таки выполнить сохранение кнопкой Save, но после сохранения сменить текущую строку, а потом к ней снова вернуться и повторить действие, выделенное жирным шрифтом, то состояние строки также не будет меняться и останется Unchanged.

А вы говорите, что ж тут непонятного.
Непонятно. Самое главное, я пока не знаю, как избежать этого. Строка не должна неконтролируемо менять состояние на Modified, иначе имеет место ситуация, когда ESC-ом невозможно откатить внесенные пользователем изменения.
...
Рейтинг: 0 / 0
21.04.2015, 14:21
    #38941601
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
Вакшуль Сергей, а кнопка Save у Вас на ToolStrip-е и следовательно клик по ней не приводит к возникновению событий Validating/Validate в текущей ячейке.
Разместите кнопку в другом месте и поведение наверняка изменится.
...
Рейтинг: 0 / 0
21.04.2015, 14:47
    #38941627
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
skyANA,

Мне то, нужно, чтобы клик был по ToolStrip(возможно потом будет и контекстное меню)

Кстати, если не ошибаюсь, то при попытке дотянутся и кликнуть по кнопке, лежащей не на ToolStrip, а на форме, то еще до того как запуститься обработчик события кнопки, грид запустит механизм сохранения записи, т.к. фокус должен уйти на кнопку.
...
Рейтинг: 0 / 0
21.04.2015, 14:58
    #38941640
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
Вакшуль Сергей, ToolStrip (MenuStrip) не забирают фокус и не вызывают Validating/Validate. Сделано это специально.
...
Рейтинг: 0 / 0
21.04.2015, 15:03
    #38941649
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
skyANAВакшуль Сергей, ToolStrip (MenuStrip) не забирают фокус и не вызывают Validating/Validate. Сделано это специально.
да, так и есть. Поэтому нужно написать свой код на этот случай, что я и делаю. Уперся в проблему. Вот думаю, как решить.
...
Рейтинг: 0 / 0
21.04.2015, 17:27
    #38941827
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
Вакшуль Сергей, дак может таки фокус забирать при сохранении?
...
Рейтинг: 0 / 0
21.04.2015, 18:01
    #38941865
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
skyANA,

в принципе можно попробовать. Только в этом случае нужно будет заботиться чтобы было куда его переносить, и чтобы это было универсально.

Просто мне не хотелось бы городить огород. Ведь тут по идее уже все должно быть отработано. Думал, может кто поделится опытом.
...
Рейтинг: 0 / 0
21.04.2015, 18:21
    #38941886
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
Вакшуль Сергей, воспользоваться InvokeLostFocus?
...
Рейтинг: 0 / 0
21.04.2015, 18:27
    #38941891
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
skyANA,

я пробовал.

Но это ничего не дает. Само событие можно возбудить, и если на него есть подписчики, они получат уведомление. Но не более того.
Последующих событий Validating/Validate не произойдет.
...
Рейтинг: 0 / 0
22.04.2015, 11:05
    #38942275
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему Row.State при переходе от одного поля к другому меняется с Unchanged на Modified? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]