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

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

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

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

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

Спасибо!


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

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

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

В делфи такого типа поле было в самом наборе данных (TTable, TpFIBDataSet...), а грид сам подстраивался под источник
...
Рейтинг: 0 / 0
Опять LOOKUP
    #35954393
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан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
Опять LOOKUP
    #35958499
Руслан05
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем ничего лучшего не придумал, кроме как хранить параметры полей каждого справочника в базе данных
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Опять LOOKUP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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