Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в DataGridView использовать static DataSet? 
:(
    Опции темы
ZVano
  Дата 13.5.2024, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: нет
Всего: 4



Доброго времени суток, форумчане.

Наткнулся на проблему привязки DataSet к DataGridView в случае, когда экземпляр DataSet не принадлежит форме.
В моем случае, типизированный класс DatasSet генерируется конструктором VisualStudio.
Я хочу создать в приложении один экземпляр этого класса и использовать во всех формах проекта.

Однако наткнулся на непонимание как это реализуется в C# + WindowsForm для .NET
Куда копать?
Как это делается в Visual Studio?

В Embarcadero  Delphi это делалось просто.
1. Создвался невизуальный класс DataModule (Например TDataModule1) 
На него кидался DataSet с именем ds1
2. Создавалась глобальный объект класса TDataModule1 (например dm1)
3. В TForm1 выполнялся using TDataModule1 в котором объявлен dm1
Все. 
С этого момента все компоненты внутри TForm1 видят dm1.ds1 
Визуальный редактор форм позволяет подставить dm1.ds1  в свойствах графических компонент, выполняя привязку к данным.

Проект на GitHub https://github.com/ZVanoZ/file-monitoring
Код

   /**
    * ./StateSchema/Schema.Designer.cs
    * Класс-наследник от DataSet
    * Генерируется на основании "Schema.xsd" в визуальном конструкторе схемы данных Visual Studio 2022 CE
    */
    public partial class State : global::System.Data.DataSet {
       //...
    }

    /**
     * Попытка 1. Хотел реализовать его.
     * Статический класс для создания одного экземпляра  State на все приложение.
     * Можно рассматривать как "DataModule" в Pascal
     */
    public static class StaticStateAdapter
    {
        /**
          * state наследник DataSet 
          * По идее, его можно использовать во всем проекте 
          */
        public static AppFileMonitoring.StateSchema.State state = new AppFileMonitoring.StateSchema.State();
        // ... статические методы для управления набором данных (загрузка, сохранение, конвертация)
    }

   /**
    * Попытка 2.
    * После неудачи с 1й попыткой, хотел отнаследоваться от постоянно перегенерируемого "State : DataSet".
    * В дальнейшем была мысль "подсовывать" всем компонентам, которые используют этот класс, ссылки из статического экземпляра. 
    */
    public partial class StateAdapter : State 
    {
        public static StateAdapter state;
        static StateAdapter() {
            state = new StateAdapter();
        }

        /** 
         * Классический Singleton не проходит т.к. конструктор форм использует публичный конструктор.
         * <code>
         * private StateAdapter(){}
         * </code>
         */
        public StateAdapter()
        {
            //...
        }

        public static StateAdapter Instance {
            get
            {
                return state;
            }
        }
        public static StateAdapter GetInstance()
        {
            return state;
        }

    }
  
    // Вариант 1.
    // Конструктор формы создает новый экземпляр State
    /**
     * FormMain.Designer.cs
     */
    partial class FormMain
    {
        private System.Windows.Forms.DataGridView gridActivity;
        private StateSchema.State state;
        private System.Windows.Forms.BindingSource stateBindingSource; // Это добавил конструктор форм

        private void InitializeComponent()
        {
            this.state = new AppFileMonitoring.StateSchema.State();      // Этого не надо. У нас уже есть глобальный экземпляр в StaticStateAdapter.state 
            ((System.ComponentModel.ISupportInitialize)(this.state)).BeginInit();

            this.state.DataSetName = "State";
            this.state.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
            this.stateBindingSource.DataSource = this.state;
            this.stateBindingSource.Position = 0;

            this.gridActivity = new System.Windows.Forms.DataGridView();
            ((System.ComponentModel.ISupportInitialize)(this.gridActivity)).BeginInit();
            this.gridActivity.AutoGenerateColumns = false;
            this.gridActivity.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.gridActivity.DataSource = this.stateBindingSource;       // Вот этого не надо
            this.gridActivity.Dock = System.Windows.Forms.DockStyle.Fill;
            this.gridActivity.Location = new System.Drawing.Point(3, 59);
            this.gridActivity.Name = "gridActivity";
            this.gridActivity.ReadOnly = true;
            this.gridActivity.Size = new System.Drawing.Size(786, 315);
            this.gridActivity.TabIndex = 2;
    }


    // Вариант 2.
    // Происходит, если во вкладке "Источники данных" создать новый источник.
    // 1. Выбираем "Источники данных" 
    // 2. Выбираем "Обїект". Жмем "Далее".
    // 3. Выбираем в "Укажите объекты для привязки" AppFileMonitoring.StateAdapter
    //    Появляется источник данных "StateAdapter".
    //    Где он хранится? - ХЗ
    //    Когда создается? - ХЗ
    // Потенциально то что нам надо.
    // Конструктор формы создает новый экземпляр BindingSource, но экземпляр  DataSource вроде как не создает.
    /**
     * FormMain.Designer.cs
     */
    partial class FormMain
    {

        private System.Windows.Forms.BindingSource stateAdapterBindingSource; // Вот такой источник данных создал GUI мастер форм
        private System.Windows.Forms.DataGridView gridDirs; // Вот к этому гриду надо привязать StaticStateAdapter.state

        private void InitializeComponent()
        {

            this.stateAdapterBindingSource = new System.Windows.Forms.BindingSource(this.components);
            ((System.ComponentModel.ISupportInitialize)(this.stateAdapterBindingSource)).BeginInit();
            // stateAdapterBindingSource
            this.stateAdapterBindingSource.DataMember = "Dirs";
            this.stateAdapterBindingSource.DataSource = typeof(AppFileMonitoring.StateAdapter);     // Вот интересный момент. Экземпляр не создается, но указывается нкжный тип данных для DataSource
            this.stateAdapterBindingSource.CurrentChanged += new System.EventHandler(this.stateAdapterBindingSource_CurrentChanged);
            ((System.ComponentModel.ISupportInitialize)(this.stateAdapterBindingSource)).EndInit();


            this.gridDirs = new System.Windows.Forms.DataGridView();
            ((System.ComponentModel.ISupportInitialize)(this.gridDirs)).BeginInit();
            this.gridDirs.AllowUserToOrderColumns = true;
            this.gridDirs.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
            this.gridDirs.Dock = System.Windows.Forms.DockStyle.Fill;
            this.gridDirs.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
            this.gridDirs.Location = new System.Drawing.Point(3, 76);
            this.gridDirs.Name = "gridDirs";
            this.gridDirs.ReadOnly = true;
            this.gridDirs.Size = new System.Drawing.Size(786, 298);
            this.gridDirs.TabIndex = 1;
        }



--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.1093 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.