Алгоритмическая проверка двух десятков значений, текстовых полей и столбцов данных
-
03-07-2019 - |
Вопрос
Итак, большие мозги, вот кое-что, что является скорее вызовом, чем требованием.Я немного озадачен.Обычно мне просто нужен толчок в нужном направлении, так что приготовьте свои палочки.
У меня есть tabcontrol, покрытый текстовыми полями.Я хочу выполнить проверку содержимого всех текстовых полей во время события SelectedIndexChanged в listview в той же форме.Если одно из текстовых полей содержит данные, отличные от строки DataTable, представленной элементом ListView, я хочу, чтобы оно спросило, хотел бы пользователь сохранить только что внесенные изменения.Если ничего не изменилось, я хочу, чтобы он просто изменил выбор.
Итак, очевидно, что я сравниваю содержимое текстовых полей с соответствующими столбцами в datarow.
Я мог бы просто выполнить проверку методом грубой силы и выполнять каждую отдельную проверку по одной за раз.Я бы предпочел придумать какой-нибудь умный алгоритмический способ циклического перемещения по текстовым полям tabcontrol и сверки значений со значениями столбцов.
Есть какие-нибудь предложения?
Редактировать:Мне больше всего нравится приведенное ниже решение с "умно названными текстовыми полями", хотя оба хороши.Если в течение следующих 14 дней ни у кого больше не появится идеи получше, текстовое поле ответа получит зеленый цвет.
Решение
Дайте текстовым полям разумное название, так как в части имени находится название столбца / строки.
Сгруппируйте элементы управления textbox в цикл по ним.Для каждого элемента управления получите имя (части) и используйте его как ссылку на ваш datatable.Проверьте значения.
Другие советы
Если я правильно вас понимаю, вы хотите избежать сравнения каждого текстового поля при каждом изменении, в пользу простой проверки текстовых полей, которые были изменены, управляемых событием SelectedIndexChanged элемента управления ListView.Это правда?
Что ж, в DataRows и DataTables уже реализовано управление версиями строк и откаты, поэтому, если вы привязываете текстовые поля к базовой строке (либо записывая события для обратной записи при изменении / потере фокуса, либо используя автоматизированный механизм для выполнения той же задачи), затем проверьте свойство RowState в SelectedIndexChanged .Если значение RowState отличается от неизмененного, попросите пользователя сохранить его.Если он сохранит, зафиксируйте изменения, в противном случае отклоните их.
Так, например, вы хотели бы использовать что-то подобное в вашем обработчике событий SelectedIndexChanged:
if (row.RowState == DataRowState.Modified) {
// prompt for user input
if (promptResult == PromptResult.Save) {
row.AcceptChanges();
}
else {
row.RejectChanges();
}
}