Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Опять LOOKUP / 4 сообщений из 4, страница 1 из 1
24.04.2009, 00:11
    #35951390
Руслан05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять LOOKUP
Здравствуйте!

У меня такая задача:

Есть приложение использующее базу данных с перечнем справочников.
Некоторые содержат не только пля ID, Name, а могут еще содержать поля связанные с другим справочником, например ID, Name, Job_ID (берется из спр. JOB).
Так вот в делфи я содавал для каждого справочника объект TDataSet (TFIBDataSet)
в котором инициализировал все поля (русское название, ширина, выравнивание...) и создавал lookup поля (напр. для JOB_ID).

Существовала единая форма отображения и форма редактирования справочника, которые анализируя типы полей DataSeta строили форму редактирования текущей записи, а грид отображал все записи.

В общем вопрос в том как подобное сделать в C# ADO.NET т.к. в DataTable нет lookup полей.
Хочется просматривать и редактировать все с помощью одних форм, динамически их формируя

Спасибо!


На делфи
...
Рейтинг: 0 / 0
25.04.2009, 21:50
    #35954228
Руслан05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять LOOKUP
Подскажите в каком направлении копать, иил ссылки

С помощью DataRelation можно указать связь поля (напр. JOB_ID)с полем в другой таблице (нап. JOB.ID), но невозможно указать какое поле использовать для подстановки. это может быть Name, Job_Name или др.

То что мне нужно реализуется в DataGridView. Тип столбца DataGridViewComboBox
параметр DisplayMember - какое поле отображать
параметр ValueMember - с каким связывать
параметр DataSource - таблица источник

В делфи такого типа поле было в самом наборе данных (TTable, TpFIBDataSet...), а грид сам подстраивался под источник
...
Рейтинг: 0 / 0
26.04.2009, 03:05
    #35954393
Сахават Юсифов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять LOOKUP
Руслан05,

Вот для Девок.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
        private void PrepareElementsOfForm(Guid objecttype, GridView gw, Guid rel)
        {
            DevExpress.XtraGrid.Columns.GridColumn gcc = gw.Columns.Add();
            gcc.FieldName = "Наименование";
            gcc.Caption = gcc.FieldName;
            gcc.Name = gcc.FieldName;
            gcc.ColumnEditName = gcc.FieldName;
            gcc.Visible = true;

            List<BindingSource> bsa = new List<BindingSource>();
            List<DevExpress.XtraEditors.Repository.RepositoryItemLookUpEdit> lea = new List<DevExpress.XtraEditors.Repository.RepositoryItemLookUpEdit>();

            var ntypes = (from nt in this.main.DS.ТипСсылкаНаТип
                          where (nt.RowState != DataRowState.Deleted) && (nt.ТипИД.ToString() == objecttype.ToString())
                          select nt).OrderBy(t => t.Уровень);
            foreach (DataRow i in ntypes)
            {
                gcc = gw.Columns.Add();
                gcc.FieldName = i["Наименование"].ToString();
                gcc.Caption = gcc.FieldName;
                gcc.Name = gcc.FieldName;
                gcc.ColumnEditName = gcc.FieldName;
                gcc.Visible = true;
                if (rel != Guid.Empty)
                {
                    if (i["СсылкаНаТипИД"].ToString() == rel.ToString())
                    {
                        gcc.Visible = false;
                    }
                }


                bsa.Add(new BindingSource());
                bsa[bsa.Count - 1].DataSource = this.main.DS;
                bsa[bsa.Count - 1].DataMember = "Объект";

                if (this.main.bsResourceClass.Find("ИД", i["СсылкаНаТипИД"]) >= 0)
                {
                    bsa[bsa.Count - 1].Filter = "ИД <> ТипИД AND ТипИД='" + i["СсылкаНаТипИД"].ToString() + "'";
                }
                else
                {
                    int edge = this.main.bsGroup.Find("КлассификаторИД", i["СсылкаНаТипИД"]);
                    if (edge > 0)
                    {
                        DataRow drp = this.main.DS.Классификатор.FindByИД((Guid)(((DataRowView)this.main.bsGroup[edge])["ИД"]));

                        StringBuilder sb = new StringBuilder();
                        while (drp != null)
                        {
                            RecurciveTypes(drp, sb);
                            if (sb.ToString().Length == 0)
                            {
                                if (drp["РодительИД"].ToString() != this.main.empGuid)
                                {
                                    drp = this.main.DS.Классификатор.FindByИД((Guid)drp["РодительИД"]);
                                }
                                else break;
                            }
                            else break;
                        }

                        if (sb.ToString().Length > 0)
                        {
                            bsa[bsa.Count - 1].Filter = "ИД <> ТипИД AND Convert(ТипИД, 'System.String') IN (" + sb.ToString() + ")";
                        }
                    }
                }

                lea.Add(new DevExpress.XtraEditors.Repository.RepositoryItemLookUpEdit());
                lea[lea.Count - 1].DataSource = bsa[bsa.Count - 1];
                lea[lea.Count - 1].DisplayMember = "Наименование";
                lea[lea.Count - 1].ValueMember = "ИД";
                lea[lea.Count - 1].Buttons.Add(new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Plus));
                lea[lea.Count - 1].ButtonClick += new DevExpress.XtraEditors.Controls.ButtonPressedEventHandler(lea_ButtonClick);
                DevExpress.XtraEditors.Controls.LookUpColumnInfo lcin = new DevExpress.XtraEditors.Controls.LookUpColumnInfo("Наименование");
                lea[lea.Count - 1].Columns.Add(lcin);

                gcc.ColumnEdit = lea[lea.Count - 1];
            }


            var nprops = (from nt in this.main.DS.ТипСвойство
                          where (nt.RowState != DataRowState.Deleted) && (nt.ТипИД.ToString() == objecttype.ToString())
                          select nt).OrderBy(t => t.СвойствоRow.Наименование);
            foreach (DataRow i in nprops)
            {
                int prop = this.main.bsProperty.Find("ИД", i["СвойствоИД"]);

                gcc = gw.Columns.Add();
                gcc.FieldName = ((DataRowView)this.main.bsProperty[prop])["Наименование"].ToString();
                gcc.Caption = gcc.FieldName;
                gcc.Name = gcc.FieldName;
                gcc.ColumnEditName = gcc.FieldName;
                gcc.Visible = true;
                switch (((DataRowView)this.main.bsProperty[prop])["Тип данных"].ToString())
                {
                    case "Дата":
                        gcc.ColumnEdit = gw.GridControl.RepositoryItems["repositoryItemДата1"];
                        break;
                    case "Число":
                        gcc.ColumnEdit = gw.GridControl.RepositoryItems["repositoryItemЧисло"];
                        break;
                    case "Целое":
                        gcc.ColumnEdit = gw.GridControl.RepositoryItems["repositoryItemЦелое1"];
                        break;
                }
            }


            gcc = gw.Columns.Add();
            gcc.FieldName = "Выбран".ToString();
            gcc.Caption = gcc.FieldName;
            gcc.Name = gcc.FieldName;
            gcc.ColumnEditName = gcc.FieldName;
            gcc.Visible = false;


            int cls = this.main.bsResourceClass.Find("ИД", objecttype);
            if (cls >= 0)
            {
                if (gw.Columns.ColumnByFieldName("Наименование") != null)
                {
                    if (bool.Parse(((DataRowView)(this.main.bsResourceClass[cls]))["Отношение"].ToString()))
                    {
                        gw.Columns["Наименование"].Visible = false;
                    }
                }
            }
        }
...
Рейтинг: 0 / 0
28.04.2009, 14:45
    #35958499
Руслан05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять LOOKUP
В общем ничего лучшего не придумал, кроме как хранить параметры полей каждого справочника в базе данных
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Опять LOOKUP / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]