Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 21 сен 2019, 19:14

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: 13 фев 2019, 12:42 
Не в сети

Зарегистрирован: 30 май 2016, 08:09
Сообщений: 46
Здравствуйте.
Начали пробовать работать в VS. Собственно в VCL были удобные методы сохранявшие параметры сетки в реестр SaveColumnsLayout и RestoreColumnsLayout.
Но в WinForms что-то таких методов нет. Можно как-то проделать эту операцию?
Спасибо


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 15 фев 2019, 11:56 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 971
Добрый день.

В WinForms подобный механизм имеется и работает следующим образом.

Для записи настроек используется метод DataGridEh.GetStorableSettings
Код:
  public virtual Dictionary<string, object> GetStorableSettings()

который возвращается коллекцию настроек (Список колонок с сохраненными значениями свойств Width, DisplayIndex, Visible)
Затем разработчик дописывает код в программе который переписывает коллекцию в хранилище данных.
Обычно для записи коллекции используют сериализацую в текстовое представление в виде форматированного текста.
Например, с помощью класса JavaScriptSerializer коллекцию можно записать в виде JSON строки.
Полученную строку можно запись в текстовое хранилище данных.

При загрузке настроек грида используется метод DataGridEh.ReadStorableSettings
Код:
  public virtual void ReadStorableSettings(Dictionary<string, object> settings)

Коллекция settings должны быть создана и считана заранее из хранилища настроек.
Обычно настройки считывают из текстового файла.
Если настройка была сохранена в виде JSON строки, то из нее можно получить объект Dictionary<string, object>
с помощью метода

Код:
  JavaScriptSerializer.Deserialize<Dictionary<string, object>>(JSONString)


Использование хранилища в виде коллекции Dictionary<string, object> дает возможно создавать вложенные коллекции любого уровня глубины.
После создания коллекции самого верхнего уровня, ее сериализуют в строку и записывают в хранилище.

Код:
      var mainLevelSettings = new Dictionary<string, object>();
       
      // Положение размер формы     
      mainLevelSettings.Add("Location", Location);
      mainLevelSettings.Add("Size", Size);
     
      //Настройки гридов формы
      mainLevelSettings.Add("dataGrid1", dataGrid1.GetStorableSettings());
      mainLevelSettings.Add("dataGrid2", dataGrid2.GetStorableSettings());


При сериализации все вложенные коллекции автоматически запишутся в строку в виде вложенного участка форматированной строки.

Пример использования данной технологии смотрите в демо проекте Demos\EhLibDemos.sln
Поставьте точки останова на методах
private void MainForm_Load(object sender, EventArgs e)
private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
чтобы посмотреть, как происходит чтение и запись настроек форм и контролов в/из хранилища настроек.

Настройки записываются в файл MainDemo\bin\Debug\MainDemo.exe.dsk

Код:
<?xml version="1.0" encoding="utf-8"?>
<Settings>
  <FrameMainGrid>{"Controls":{"dataGrid1":{"MultiTitleItems":{"colOrdedId":{"Visible":true,"Width":52,"Index":0},"superTitleEmployee":{"Visible":true,"Index":1,"Items":{"colEmpId":{"Visible":true,"Width":50,"Index":0},"colComboBoxEmpName":{"Visible":true,"Width":138,"Index":1}}},"dataGridSuperTitle1":{"Visible":true,"Index":2,"Items":{"colCustId":{"Visible":true,"Width":50,"Index":0},"dataGridComboBoxColumn1":{"Visible":true,"Width":117,"Index":1}}},"colShipFee":{"Visible":true,"Width":99,"Index":3},"dataGridSuperTitle2":{"Visible":true,"Index":4,"Items":{"colOrdDate":{"Visible":true,"Width":124,"Index":0},"colShipDate":{"Visible":true,"Width":114,"Index":1}}},"colShipperId":{"Visible":true,"Width":51,"Index":5},"colShipName":{"Visible":true,"Width":150,"Index":6}}}}}</FrameMainGrid>
  <MainFormSettings>{"LanguageId":null,"Location":{"IsEmpty":false,"X":518,"Y":216},"Size":{"IsEmpty":false,"Width":1138,"Height":745}}</MainFormSettings>
</Settings>

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 фев 2019, 09:04 
Не в сети

Зарегистрирован: 30 май 2016, 08:09
Сообщений: 46
Спасибо. В VCL все было проще. Нужно было просто вызвать соответствующую функцию.
На самом деле пока ждал ответа, я все эти танцы с сериализацией уже станцевал. Ведь все эти нюансы можно было спрятать внуnри компонента, как было в VCL.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB