Сохранение настроек расположения и ширины колонок в компоненте datagridview.

      В данной статье рассмотрено создание методов сохранения и восстановления расположения и ширины колонок в элементе управления datagridview.
      Создайте проект «Windows Form» в «Microsoft Visual Studio», для этого откройте Microsoft Visual Studio 2010 и перейдите в меню: файл -> создать проект…
      В открывшемся окне «Создать проект» в правой части «установленные шаблоны» выберете раздел Visual C# и подраздел Windows. Из предложенных шаблонов выберете «Приложение Windows Form». В нижней части окна введите имя вашего проекта и его расположение на вашем компьютере. После выполнения этих действий нажимаете кнопку «ОК» для выполнения процесса создания нового проекта. По завершению создания проекта у вас откроется главная форма вашего проекта.
добавьте компонент DataGridView на форму, для этого перейдите в меню: Вид -> панель элементов.
      В правой части программы вы увидите новую панель с заголовком «Панель элементов». Найдите компонент DataGridView, сделайте клик левой клавишей мыши по компоненту и затем также клик левой клавишей мыши по вашей форме открытой при создании проекта.
      Вы увидите размещенный компонент на форме, нажмите правой клавишей мыши по компоненту и выберете пункт «Свойства», из открывшегося контекстного меню.
      У вас откроется окно со свойствами выбранного элемента управления, найдите свойство Dock и выберете вариант размещения компонента на форме Fill, данный параметр растягивает элемент управления на все рабочее пространство формы.
      Выполните двойной щелчок левой клавишей мыши по заголовку формы.
      У вас откроется новая вкладка с редактором кода вашей формы и методом Form1_Load, события Load, которое возникает каждый раз при запуске вашего проекта. Вставьте приведенный ниже код в тело данного метода, выполняющий заполнение тестовыми данными элемента управления «dataGridView».
private void Form1_Load(object sender, EventArgs e)
{
    //Инициализируем новый экземпляр класса System.Data.DataTable и передаем
    //ему аргументы.
    DataTable dt = new DataTable();
    //Создаем и добавляем объект System.Data.DataColumn с указанным именем
    dt.Columns.Add("Name");
    dt.Columns.Add("Telephone");
    dt.Columns.Add("City");
    dt.Columns.Add("Country");
    dt.Columns.Add("Adress");
    //Задаем источник данных, для которого объект
    //System.Windows.Forms.DataGridView отображает данные.
    dataGridView1.DataSource = dt;

    //Задаем текст, используемый для подсказок.
    dataGridView1.Columns[0].ToolTipText = "Имя пользователя";
    dataGridView1.Columns[1].ToolTipText = "Телефонный номер пользователя";

    //Задаем текст ячейки заголовка столбца.
    dataGridView1.Columns[0].HeaderText = "Имя";
    dataGridView1.Columns[1].HeaderText = "Телефон";
    dataGridView1.Columns[2].HeaderText = "Город";
    dataGridView1.Columns[3].HeaderText = "Страна";
    dataGridView1.Columns[4].HeaderText = "Адрес";
    SetColumnOrder(dataGridView1);
}
      Для просмотра созданных колонок (столбцов) запустите проект, нажав на клавиатуре клавишу F5.
      Далее необходимо создать новый класс в проекте, для этого в обозревателе решений сделайте клик правой клавишей мыши по названию вашего проекта и выберете из открывшегося контекстного меню, пункт Добавить-> Создать элемент…
      У вас откроется новое окно «Создать элемент…» в котором выберете шаблон «Класс», задайте ему имя и нажмите кнопку «Добавить».
У вас откроется новая вкладка:
Удалите класс Settings и замените его два класса представленных ниже:
internal sealed class DataGridViewSetting : ApplicationSettingsBase
{
    private static DataGridViewSetting _defaultInstace =
        (DataGridViewSetting)ApplicationSettingsBase.Synchronized(new DataGridViewSetting());
    
    public static DataGridViewSetting Default
    {
        get { return _defaultInstace; }
    }    

    [UserScopedSetting]
    [SettingsSerializeAs(SettingsSerializeAs.Binary)]
    [DefaultSettingValue("")]

    public Dictionary<string, List<columnorderitem>> ColumnOrder
    {
        get { return this["ColumnOrder"] as Dictionary<string, List<columnorderitem>>; }
        set { this["ColumnOrder"] = value; }
    }
}

[Serializable]
public sealed class ColumnOrderItem
{
    public int DisplayIndex { get; set; }
    public int Width { get; set; }
    public bool Visible { get; set; }
    public int ColumnIndex { get; set; }
}
Теперь переходим в код главного приложения и добавляем два метода, первый на сохранение, второй на загрузку настроек.
private void SaveColumnOrder(DataGridView name)
{
    if (name.AllowUserToOrderColumns)
    {
        List<columnorderitem> columnOrder = new List<columnorderitem>();
        DataGridViewColumnCollection columns = name.Columns;
        for (int i = 0; i < columns.Count; i++)
        {
            columnOrder.Add(new ColumnOrderItem
            {
                ColumnIndex = i,
                DisplayIndex = columns[i].DisplayIndex,
                Visible = columns[i].Visible,
                Width = columns[i].Width
            });
        }
        DataGridViewSetting.Default.ColumnOrder[this.Name] = columnOrder;
        DataGridViewSetting.Default.Save();
    }
}

private void SetColumnOrder(DataGridView name)
{
    if (!DataGridViewSetting.Default.ColumnOrder.ContainsKey(this.Name))
        return;

    List<ColumnOrderItem> columnOrder =
        DataGridViewSetting.Default.ColumnOrder[this.Name];

    if (columnOrder != null)
    {
        var sorted = columnOrder.OrderBy(i => i.DisplayIndex);
        foreach (var item in sorted)
        {
            name.Columns[item.ColumnIndex].DisplayIndex = item.DisplayIndex;
            name.Columns[item.ColumnIndex].Visible = item.Visible;
            name.Columns[item.ColumnIndex].Width = item.Width;
        }
    }
}
      Добавьте их вызов при запуске проекта и при его закрытии. Пример загрузки сохраненных настроек представлен ниже:
SetColumnOrder(dataGridView1);
Так же делаете и для сохранения.

Ссылка для скачивания примера: Яндекс.Диск


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!