"EhLib.Com"
https://forum.ehlib.com/ru/

Сохранение\восстановление параметров сетки
https://forum.ehlib.com/ru/viewtopic.php?f=9&t=2738
Страница 1 из 1

Автор:  ООО ЛОГОСКОР [ 13 фев 2019, 12:42 ]
Заголовок сообщения:  Сохранение\восстановление параметров сетки

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

Автор:  EhLibSupport [ 15 фев 2019, 11:56 ]
Заголовок сообщения:  Re: Сохранение\восстановление параметров сетки

Добрый день.

В 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>

Автор:  ООО ЛОГОСКОР [ 18 фев 2019, 09:04 ]
Заголовок сообщения:  Re: Сохранение\восстановление параметров сетки

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

Страница 1 из 1 Часовой пояс: UTC
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/