none
Как сохранить оформление DataGridView? (Стиль шрифтов, цвет ячеек, ширина столбцов и т.д.) RRS feed

  • Вопрос

  • Здравствуйте.

    Подскажите как сохранить оформление DataGridView? (Стиль шрифтов, цвет ячеек, ширина столбцов и т.д.). Как сохранить данные в XML с использованием схемы я знаю. А вот как сохранить полное оформление таблицы не знаю. Точнее не получается. Пытался сохранить данные в Datatabl, но при загрузке файла происходит пачканье программы. Остаются следы от курсора и т.д. Таблица содержит более 100 столбцов и более 1000 строк, поэтому нужен действующий метод.

    Заранее благодарю.

    Если есть какой то пример, то буду признателен.

    Работаю в VB2010
    • Изменено Aleksahka 29 января 2015 г. 17:59
    29 января 2015 г. 15:49

Ответы

  • Aleksahka, на ваши вопросы так мало откликов, потому что форумчан, пишущих на VB.NET, довольно мало.

    В DataSet/DataTable сохраняются только данные, а настройки грида нужно самостоятельно сохранять. Способы есть разные. Писать примеры на языке, который плохо знаю, не буду. Предложу просто посмотреть по ссылкам: https://www.google.ru/search?q=datagridview+save+settings+vb.net.

    "Пачканье" происходит от выполнения длительных операций в потоке UI, как я уже писал в вашей прошлой теме. Загрузку и сохранение настроек датагрида выполняйте в отдельном потоке или задаче. Используйте TaskFactory.StartNew.

    29 января 2015 г. 18:46
  • Будет совсем хорошо, если вы выложите файл *.SanoMo заполненный данными, чтобы я мог его открыть у себя. Так-то я повводил немного руками, но вдруг что-то не учёл.

    Эффекта смазывания изображения я у себя не заметил.
    А вот если нажать кнопку "Обновить данные" на вкладке "Сводная", то добавляются строки чудовищно медленно, при этом приложение "замерзает". Вот тут-то и можно применять дополнительный поток/задачу.

    У вас в коде часто используется RemoveAt(0) в цикле. Это неэффективно: при удалении первой колонки/строки все остальные сдвигаются на освободившееся место. Лучше удалять с конца - при этом не будет сдвига всех остальных строк.
    Да и вообще можно вызывать Columns.Clear(), Rows.Clear().

    То же касается InsertAt. Лучше использовать Add для добавления в конец. Хотя, вроде вставка у вас происходит на последнюю позицию, что по сути аналогично.

    Ещё я вижу в вашем коде такое:
    Tabl3.DataSource = T3
    T3.Columns.Add("Артикул")
    Сперва датагриду назначается источник данных, в результате чего он полностью прорисовывается, отображая имеющиеся в дататэйбле данные (хоть их там пока и нет). А потом вы добавляете колонки, что каждый раз приводит к перерисовке грида.
    Поменяйте строки местами, поставьте первую из приведённых строк в конец.

    Замечание по логике. Перед открытием файла данных у вас удаляются старые данные. Но ведь пользователь может отказаться от открытия файла, закрыв диалог. А старые данные уже удалены, с чем ему теперь работать?

    При чтении данных используется такой код:
    Tabl1.DataSource = DS.Tables("Формирование")
    При этом дататэйблы T1 и пр. остаются неинициализированными. Я так понимаю, нужно что-то вроде:
    T1 = DS.Tables("Формирование")
    Tabl1.DataSource = T1

    Теперь по обновлению сводной таблицы. Там у вас что-то странное. DataTable T3 просто очищается и дальше вообще не используется. Данные вручную копируются из первого грида в третий.
    Если их структура полностью одинакова (как мне показалось при беглом ознакомлении), то достаточно скопировать дататэйбл:
    T3 = T1.Copy()
    Tabl3.DataSource = T3
    Это весь код в Button10_Click.

    Если же их структура различна, и нужны дополнительные манипуляции с внешним видом, то делать их лучше через объект DataView - он специально для этого предназначен.

    У вас слишком много манипуляций с данными в гридах. Это логически неправильно: с данными нужно работать в модели, то есть в дататэйблах (или в коллекциях). А гриды просто отображают данных через привязку. Это базовый принцип разделения модели и представления.
    Соответственно, и таких строк в коде не должно быть:
    T1 = Tabl1.DataSource

    Кстати, дайте нормальные имена все кнопкам и прочим контролам. Тяжело ориентироваться в коде с такими именами.
    Также я бы не стал сокращать названия до T1, T2, Tabl1, Tabl2 и т. п.

    PS: давненько я не встречал в коде goto.
    31 января 2015 г. 13:11

Все ответы

  • Aleksahka, на ваши вопросы так мало откликов, потому что форумчан, пишущих на VB.NET, довольно мало.

    В DataSet/DataTable сохраняются только данные, а настройки грида нужно самостоятельно сохранять. Способы есть разные. Писать примеры на языке, который плохо знаю, не буду. Предложу просто посмотреть по ссылкам: https://www.google.ru/search?q=datagridview+save+settings+vb.net.

    "Пачканье" происходит от выполнения длительных операций в потоке UI, как я уже писал в вашей прошлой теме. Загрузку и сохранение настроек датагрида выполняйте в отдельном потоке или задаче. Используйте TaskFactory.StartNew.

    29 января 2015 г. 18:46
  • Petalvik, большое спасибо за наводку. А то совсем грустно, нигде не могу найти нужной информации. Буду пробовать.
    29 января 2015 г. 19:25
  • Создал дополнительную таблицу Datatable в которую записал цвет ячеек. При загрузке через отдельный поток при помощи  TaskFactory.StartNew, результат получился всё равно такой же.

    На потоки разбил. В таблы записал данные, а результат не меняется.

    О господи спустись с небес и вдолби мне новые знания, ибо ты всезнающий, ну, и помоги дописать это чудо.

    30 января 2015 г. 16:55
  • Покажите свой код, сохраняющий и читающий настройки датагрида.

    Можно весь проект целиком, если это доступно.

    31 января 2015 г. 9:14
  • Возможно конечно. Сохранение так же пытался делать отдельным потоком, но потом убрал, ибо на открытие файла это ни как не повлияло.

    Файл

    • Изменено Aleksahka 31 января 2015 г. 11:09 замена ссылки
    31 января 2015 г. 11:02
  • Будет совсем хорошо, если вы выложите файл *.SanoMo заполненный данными, чтобы я мог его открыть у себя. Так-то я повводил немного руками, но вдруг что-то не учёл.

    Эффекта смазывания изображения я у себя не заметил.
    А вот если нажать кнопку "Обновить данные" на вкладке "Сводная", то добавляются строки чудовищно медленно, при этом приложение "замерзает". Вот тут-то и можно применять дополнительный поток/задачу.

    У вас в коде часто используется RemoveAt(0) в цикле. Это неэффективно: при удалении первой колонки/строки все остальные сдвигаются на освободившееся место. Лучше удалять с конца - при этом не будет сдвига всех остальных строк.
    Да и вообще можно вызывать Columns.Clear(), Rows.Clear().

    То же касается InsertAt. Лучше использовать Add для добавления в конец. Хотя, вроде вставка у вас происходит на последнюю позицию, что по сути аналогично.

    Ещё я вижу в вашем коде такое:
    Tabl3.DataSource = T3
    T3.Columns.Add("Артикул")
    Сперва датагриду назначается источник данных, в результате чего он полностью прорисовывается, отображая имеющиеся в дататэйбле данные (хоть их там пока и нет). А потом вы добавляете колонки, что каждый раз приводит к перерисовке грида.
    Поменяйте строки местами, поставьте первую из приведённых строк в конец.

    Замечание по логике. Перед открытием файла данных у вас удаляются старые данные. Но ведь пользователь может отказаться от открытия файла, закрыв диалог. А старые данные уже удалены, с чем ему теперь работать?

    При чтении данных используется такой код:
    Tabl1.DataSource = DS.Tables("Формирование")
    При этом дататэйблы T1 и пр. остаются неинициализированными. Я так понимаю, нужно что-то вроде:
    T1 = DS.Tables("Формирование")
    Tabl1.DataSource = T1

    Теперь по обновлению сводной таблицы. Там у вас что-то странное. DataTable T3 просто очищается и дальше вообще не используется. Данные вручную копируются из первого грида в третий.
    Если их структура полностью одинакова (как мне показалось при беглом ознакомлении), то достаточно скопировать дататэйбл:
    T3 = T1.Copy()
    Tabl3.DataSource = T3
    Это весь код в Button10_Click.

    Если же их структура различна, и нужны дополнительные манипуляции с внешним видом, то делать их лучше через объект DataView - он специально для этого предназначен.

    У вас слишком много манипуляций с данными в гридах. Это логически неправильно: с данными нужно работать в модели, то есть в дататэйблах (или в коллекциях). А гриды просто отображают данных через привязку. Это базовый принцип разделения модели и представления.
    Соответственно, и таких строк в коде не должно быть:
    T1 = Tabl1.DataSource

    Кстати, дайте нормальные имена все кнопкам и прочим контролам. Тяжело ориентироваться в коде с такими именами.
    Также я бы не стал сокращать названия до T1, T2, Tabl1, Tabl2 и т. п.

    PS: давненько я не встречал в коде goto.
    31 января 2015 г. 13:11