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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Общий DataSet для нескольких форм, как сделать? 
V
    Опции темы
xess
Дата 19.3.2007, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.3.2007

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



Вобщем создаю типизированный датасет, размещаю его на одной из форм. Как можно взаимодействовать с ним из другой формы проекта через дизайнер? Нужно указать его в качестве datasource, но в дизайнере его не видно.

1) Пробывал изменять его на public, не помогло, дизайнер его все равно не видит.

2) Пробывал добавить его как новый DataResource с помощью мастера, но мастер максимум добавляет саму форму, а компоненты на ней он не видет.

или может что другое посоветуете по организации приложения?

А суть в том что я работаю с БД Access, планировал загружать все таблицы и связи в один общий для всех форм DataSet и потом с ним работать, после вносимых изменений обновлять за один раз файл access. Столкнувшись с вышеизложенной проблемой пока нечего лучшего не придумал как создавать для каждой формы свой DataSet. Но это ведь нерационально?  smile 
PM MAIL   Вверх
Idsa
Дата 19.3.2007, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(xess @  19.3.2007,  03:44 Найти цитируемый пост)
Но это ведь нерационально?

Конечно.

Если я правильно понял проблему, то нужно
Цитата(xess @  19.3.2007,  03:44 Найти цитируемый пост)
изменить его на public

а затем из други форм обращаться к DataSet по такому принципу: form1.myDataSet, где form1 - форма, на которую брошен DataSet.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
xess
Дата 19.3.2007, 04:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.3.2007

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



Цитата(Idsa @ 19.3.2007,  03:48)
Если я правильно понял проблему, то нужно
Цитата(xess @  19.3.2007,  03:44 Найти цитируемый пост)
изменить его на public

а затем из други форм обращаться к DataSet по такому принципу: form1.myDataSet, где form1 - форма, на которую брошен DataSet.

Спасибо, Вы поняли правильно. Но насколько я понял, данный способ годится если писать код вручную, а не через дизайнер, да? Дело в том, что в дизайнере в качестве DataSource вроде нельзя прописать подобный код "form1.myDataSet", а можно только выбрать из списка.  А в списке как раз не виден тот public DataSet. По крайней мере у меня не получалось :( А править код который генерируется дизайнером ведь тоже как-то нехорошо :(

может есть еще идеи?

Это сообщение отредактировал(а) xess - 19.3.2007, 04:30
PM MAIL   Вверх
Idsa
Дата 19.3.2007, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(xess @  19.3.2007,  04:28 Найти цитируемый пост)
Но насколько я понял, данный способ годится если писать код вручную, а не через дизайнер

Дизайнер генерирует обычный код. Так что эти два способа принципиально ничем отличаться не могут.

Итак, смотрим название типизированного ДатаСета. Делаем его public. А потом обращаемся к нему так, как я писал выше.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Voyager
Дата 20.3.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

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



Для описанной проблемы в дизайнере этого сделать нельзя. 
Цитата(xess @  19.3.2007,  04:28 Найти цитируемый пост)
может есть еще идеи?

Возможно стоит смотреть в сторону наследования форм.

PM   Вверх
NET_or_not_NET
Дата 20.3.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

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



Вся проблемма в том что xess делат так:
Цитата

Вобщем создаю типизированный датасет, размещаю его на одной из форм.


А не надо его делать частью одной из форм - делай его частью проекта (солюшина) и тогда он будет виден всем !!!!!
ведь как я понимаю нужен
Цитата

один общий для всех форм DataSet


Вот и всё!

P.S. 
програмно:
Код

namespace имя_Вашего_namespace {
    using System;
    public class мой_DataSet : System.Data.DataSet 
   {
         // все в Ваших руках
   }
        

проще:
в дизайнере еще проще, а главное наглядней  smile 
Солюшн -> адд новый итемс -> новый ДатаСет
и у Вас все в гарфике, с вкладочкой пропертес, с тулбоксом - блеск!  smile 

Это сообщение отредактировал(а) NET_or_not_NET - 20.3.2007, 15:01
PM MAIL   Вверх
xess
Дата 21.3.2007, 05:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.3.2007

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



Всем спасибо за советы! Особенно NET_or_not_NET!
PM MAIL   Вверх
xess
Дата 23.3.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.3.2007

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



На самом деле проблема до сих пор актуальна, кроме как использования singleton'а нечего лучше не придумал  smile  т.е. я создаю типизированный датасет AutoDataSet (саму схему), потом размещаю по пустому экземпляру этого дасета на каждую форму (тогда дизайнер видит эти экземпляры), а потом 
просто каждому экземпляру присваю значение ShareDataSet.GetInstance(), где класс ShareDataSet реализую так:

Код

    public class ShareDataSet
    {
        private static AutoDataSet instance;
        private static object syncLock = new object();

        public static AutoDataSet GetInstance()
        {
            if (instance == null)
            {
                lock (syncLock)
                {
                    if (instance == null)
                    {
                        instance = new AutoDataSet();
                    }
                }
            }

            return instance;
        }
    }


есть еще идеи?

Это сообщение отредактировал(а) xess - 23.3.2007, 10:44
PM MAIL   Вверх
NET_or_not_NET
Дата 23.3.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

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



Есть.
Надо на главной форме создать экземпляр ДатаСета - new
А затем в каждую форму использующую это ДатаСет передавать на него ссылку - ref

Правда дизайнером придется пожертвовать...

Это сообщение отредактировал(а) NET_or_not_NET - 23.3.2007, 15:07
PM MAIL   Вверх
xess
Дата 23.3.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.3.2007

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



Цитата(NET_or_not_NET @ 23.3.2007,  13:51)
Есть.
Надо на главной форме создать экземпляр ДатаСета - new
А затем в каждую форму использующую это ДатаСет передавать на него ссылку - ref

Если я правильно понял, эти ссылки создавать можно только "вручную"? Т.е. дизайнер в итоге все равно не будет видеть эти ссылки, а следовательно и общий датасет? Все-таки я хочу разобраться, можно ли общий экземпляр датасет к дизайнеру подцепить, чтоб его все формы видели?! Использование singleton'а в принципе мою задачу решила, но есть маленький недостаток:

когда я размещаю пустые экземпляры на каждую форму с помощью дизайнера, он автоматом генерирует код:
Код

this.autoDataSet1 = new AutoDataSet();


а мне бы достаточно было написать autoDataSet1 = ShareDataSet.GetInstance(); т.е. без оператора new. Но править код генератора насколько я знаю, не рекомендуется... Но ведь и оставлять конструкцию для каждой формы типа:

Код

[код генератора]
...
this.autoDataSet1 = new AutoDataSet();
...
[/код генератора]

autoDataSet1 = ShareDataSet.GetInstance()


тоже ведь не совсем оптимально?

Это сообщение отредактировал(а) xess - 23.3.2007, 15:10
PM MAIL   Вверх
NET_or_not_NET
Дата 23.3.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

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



Цитата

Но править код генератора насколько я знаю, не рекомендуется... Но ведь и оставлять конструкцию для каждой формы типа: .. тоже ведь не совсем оптимально?

Ага, ведь все равно создаеться new 

Сторлкнулся с тем что, когда на форму в дизайнене бросаеш новый ДатаСет в окне есть возможность указать 
Referenced DataSet... использую его а он всеровно new

надо разбираться, класная тема !

Это сообщение отредактировал(а) NET_or_not_NET - 23.3.2007, 16:27
PM MAIL   Вверх
NET_or_not_NET
Дата 23.3.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

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



перепробывал все что я знал - все сводиться к 
System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error   smile 

вообщем мои субъективные выводы  -  если хочешь в дизайнере тогда new
                                                             -  если работать с сылками тогда ручками  

Я обычно работаю по второму варианту, не создавая на каждой форме новый экземпляр.

чемто надо пожертвовать либо наглятностью (удобностью) либо производительностью (хотя мне кажеться  что работа с небольшими наборами данных не скажеться на производительности)

Это сообщение отредактировал(а) NET_or_not_NET - 23.3.2007, 16:27
PM MAIL   Вверх
xess
Дата 23.3.2007, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 9.3.2007

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



NET_or_not_NET, я вот попробывал для экземпляра датасета в properties установить для GenerateMember значение false, в итоге генератор кода переместил его во внутрь InitializeComponent() и определил как "is declared in a local scope, because its GenerateMember property is false". Может тут надо копать?

Добавлено @ 16:50 
По-моему, так оно и есть. По крайней мере потом можно добавить вручную в код этот самый датасет и при этом он еще в дизайнере сохраняется. Правда лишним остается что в InitializeComponent() этой формы все равно создается экземпляр датасета с помощью new, но как я понял, он потом сразу и уничтожается  smile 
PM MAIL   Вверх
NET_or_not_NET
Дата 23.3.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 10.1.2007

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



Я тоже пробывал эксперементировать с GenerateMember и даже с ресурсами (где указанно расположение ДатаСет в дизайнере)  smile 

нифига не помогает, а что касаеться 
Цитата

new, но как я понял, он потом сразу и уничтожается


честно говорю - не знаю

я пошел просить гнигу Троелсена, буду искать что он пишет про дизайнер в VS2005, как найду чтонибуть интересное отпишусь!

Тема   smile     НЕ закрыта! 


Не буду создавать новый пост....

Книгу мне не дали - сказали Designer не трогать, писать как писал через ссылки  руками, и не заниматься ерундой!
НУ и ладно! 

Все равно желание работать в дизайнере + по ссылкам = здоровое желание!

Удачи и хороших выходных ! 

Это сообщение отредактировал(а) NET_or_not_NET - 23.3.2007, 17:43
PM MAIL   Вверх
Foli
Дата 23.4.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 23.4.2007
Где: Europe

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



Вот одно из решений. Общий DataSet с поддержкой дизайнмод

Кто что думает?  smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




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


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

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