Как вы обрабатываете проверки, чтобы увидеть, изменил ли пользователь что-то в диалоге - PullRequest
2 голосов
/ 02 марта 2009

Говоря .NET WinForms здесь:

Если у вас есть приложение, в котором кто-то может изменить элементы, например, с помощью диалогового окна некоторых свойств, как вы определяете, изменил ли пользователь что-то, когда он нажимает кнопку «Отмена» (чтобы решить, отображать ли окно с сообщением об отмене подтверждения или нет) .

Я могу думать о 2 методах:

  1. Определение грязного бита и обработка всех «измененных» событий для установки этого бита в true.
  2. Клонируйте исходный объект и напишите некоторый код сравнения, чтобы определить, действительно ли измененный объект был изменен по сравнению с исходным

Есть ли более элегантный и / или более общий способ сделать это?

Ответы [ 6 ]

1 голос
/ 02 марта 2009

Оба варианта действительны.

Однако учтите следующее: пользователь изменяет значение, а затем изменяет его на исходное.

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

0 голосов
/ 03 марта 2009

Лично я бы выбрал вариант 2. Стоимость создания клонированного объекта «исходных значений» будет минимальной, если у вас нет очень большого количества полей или если некоторые не содержат большие объекты данных (большие текстовые блоки) , изображения и т. д.).

Ключевым преимуществом является то, что вы не получите «ложное срабатывание», когда пользователь изменяет значение, а затем меняет его обратно.

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

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

0 голосов
/ 02 марта 2009

Переосмыслите дизайн, в котором вы хотите отобразить диалоговое окно подтверждения. Окна подтверждения в значительной степени бесполезны, потому что пользователи вынуждены всегда нажимать «да, это я и имел в виду». Вместо этого, если пользователь отменяет действие после внесения изменения, предоставьте ему механизм для восстановления этих данных. Это особенно важно, если диалог в данных является трудным или занимает много времени для воспроизведения пользователем, не так важно, если пользователь может повторить свою работу в считанные секунды.

Чтобы ответить на ваш конкретный вопрос, я рекомендую вариант (2), где у вас есть клон объекта. Сравнение оригинала с новым - самый верный способ узнать, изменились ли данные? Если вы используете концепцию «грязного бита», убедитесь, что вы обрабатываете случай, когда пользователь изменил значение, а затем вернул его обратно. Обычно, чтобы сделать это, вы все равно должны сохранить копию оригинальной версии, чтобы вернуться к сохранению копии оригинального объекта. С копией исходного объекта в руках, вероятно, проще просто сравнить два объекта, чем управлять отслеживанием грязного бита.

0 голосов
/ 02 марта 2009

Если вы хотите узнать, изменилось ли что-нибудь (например, что именно изменилось), то при загрузке формы, GetHashCode на вашем объекте (ах), затем при закрытии, снова вызовите GetHashCode и посмотрите, если результаты отличается.

вам нужно переопределить функцию GetHashcode в ваших объектах:

Public Class Person


    Private _firstName as string = string.empty
    Private _lastName as string = string.empty
    Private _dob as Datetime = Date.MinVal
    private _weight as single = 0.0

    ...

    Public Overrides GetHashCode as Integer

        Dim sb as new System.Text.StringBuilder

        sb.append(_firstName)
        sb.append(_lastName)
        sb.append(_dob)
        ...
        sb.append(_weight)

        Return sb.ToString.GetHashCode

    End Function

End Class

это хорошо работает для наших объектов и DAL:)

НТН

0 голосов
/ 02 марта 2009

На самом деле, в диалоге нажатие кнопки «Отмена» должно просто закрыть диалоговое окно. Нажав OK / Сохранить, вы сохраните все изменения.

Итак, оба метода слегка ошибочны, так как предполагают, что вы меняете модель до того, как пользователь нажмет OK!

Я бы сделал следующее: Прикрепить объект псевдомодели к диалогу. Пусть изменения будут отражены в этом объекте, затем отметьте его на Отмена или передайте его в свой DAL на Сохранить . Если вы создаете псевдомодель только при первом изменении, почему тогда у вас есть свой бит для диалога подтверждения отмены.

0 голосов
/ 02 марта 2009

Мой DAL делает то, что вы упомянули в 2., чтобы я мог вслепую присваивать все значения обратно моему DAO, чтобы он позаботился о передаче только тех значений, которые действительно были изменены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...