Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35

Привязка к представлению

09.11.2013, 00:47. Показов 1901. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Вопрос такой: как реализовать привязку ComboBox к представлению?
У меня есть главная форма, отображающая представления в гриде (именно представления я выбрал, чтобы вместо кодов из родительских таблиц отображались соответствующие поля). При клике по строке вызывается форма редактирования, в которую я передаю текущий DataRow. В этой форме я в зависимости от типа редактируемой записи создаю контролы, в том числе, ComboBox-ы для полей, связанных с другими таблицами. И вроде как даже правильно заполняю этот самый Combobox значениями... Хотя наверно нет, на этом месте я заступорился. Привязать к обычной таблице к полю с внешним ключом не составило бы труда, а вот в представлении у меня есть только неключевое поле родительской таблицы.
Хотелось бы сделать такую привязку Combobox: текст выбранного элемента к полю из представления (строковому). Реально ли так сделать? Или мне нужно как-то реорганизовать работу с данными в программе? Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2013, 00:47
Ответы с готовыми решениями:

Поиск по представлению
Тема не совсем про программирование, но все ж таки. Есть вьюха, по которой пытаюсь делать расширенный поиск с использованием полей А и Б....

Что это жесткая привязка к точке входа, физическое смещение в файле, окрестность точки входа в файл, привязка?
Что это жесткая привязка к точке входа, физическое смещение в файле, окрестность точки входа в файл, привязка к смещению сигнатуры...

Путь к частичному представлению
Всем привет! Создала частичное представление и поместила в папке Shared, а затем на мастер странице написала путь к нему с помощью...

11
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
09.11.2013, 06:39
Цитата Сообщение от alex.gorbach Посмотреть сообщение
именно представления я выбрал, чтобы вместо кодов из родительских таблиц отображались соответствующие поля
Чем вам не устраивает вариант создания DataGridViewComboBoxColumn со стилем отображения Nothing?
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
09.11.2013, 12:14  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Чем вам не устраивает вариант создания DataGridViewComboBoxColumn со стилем отображения Nothing?
Просто у меня в одном гриде отображается порядка 10 таблиц (меняю ему DataSource в соответствии с выбранной таблицей) и включена опция AutoGenerateColumns. Вы мне предлагаете при выборе каждой таблицы руками пересоздавать все столбцы DataGridView?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
09.11.2013, 19:09
Цитата Сообщение от alex.gorbach Посмотреть сообщение
Вы мне предлагаете при выборе каждой таблицы руками пересоздавать все столбцы DataGridView?
Я вам пока что ни чего не предлагал. Я лишь спросил, чем не устраивает отображение значения внешнего ключа через DataGridViewColumn.
У вас в реальной таблице хранится не строковое поле, а внешний ключ. И вам нужно, чтобы в результате редактирования у вас имзменился именно внешний ключ, а не его строковое представление.
Все, что вы описали в первом посте, очень абстрактно. Допустим, я до конца не понял, что вы имеете в виду под термином "Представление". Это объект DataView в C#? Или это VIEW в СУБД? Или это что то еще? Не ясно, также, как у вас происходит процедура вставки и обновления данных в БД, если вы предпочитаете работать с представления, в которых нет внешний ключей, а есть только их текстовое представление. Таких нюансов масса, поэтому что то вам предлагать бессмыслено. Могу вам только сказать, что тот путь, который выбрали вы, может оказаться намного геморойне, нежели ручное создание колонок для 10-ка гридов.
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
09.11.2013, 22:16  [ТС]
kodv, простите за неточность. Просто первый раз столкнулся с ADO.net, не представляю, как грамотно организовать просмотр и редактирование БД. Был бы признателен за консультацию, с чего начать и как это красиво сделать. Вот какие задачи мне нужно реализовать:
- просмотр всех таблиц БД, как родительских, так и дочерних, причем в дочерних вместо внешних кодов должны отображаться осмысленные поля
- не делать отдельный грид для каждой таблицы, отображать разные таблицы в одном гриде, дабы программа была компактной
- должна быть форма редактирования, в которой можно было бы выбирать комбобоксами значения из других таблиц, причем форма тоже должна быть одна и наверное контролы должны добавляться динамически, в зависимости от типа редактируемой записи.

Это вот пожелания, а как это грамотно реализовать я и хотел бы услышать.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
10.11.2013, 08:08
Как я понял, у вас заранее выгружаются все таблицы, в таком случае вам лучше прописать все отношения (DataRelation) в своем DataSet (У вас же все таблицы в DataSet хранятся, а не по отдельности?). Подробности создания отношений по ссылке. Заодно можно там и про другие стороны ADO.NET цепануть. Когда у вас будет DataSet, состоящий из связанных таблиц, вы сможете создавать комбобоксы (как в гриде, таки на форме), подставляя туда нужный источник данных для лукапа.

Возник еще в голове вариант возрвращать в представлении как строкове поле так и ключ. Но этот вариант скорее всего тоже заведет в тупик. Потому что нужно будет писать универсальный алгоритм, определяющий, какие колонки в гриде скрыть. И нужно быдет каким то образом в момент создания ComboBox определять, на какую все таки таблицу ссылается внешний ключ.
1
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
10.11.2013, 11:54  [ТС]
Цитата Сообщение от kodv Посмотреть сообщение
Возник еще в голове вариант возрвращать в представлении как строкове поле так и ключ. Но этот вариант скорее всего тоже заведет в тупик. Потому что нужно будет писать универсальный алгоритм, определяющий, какие колонки в гриде скрыть. И нужно быдет каким то образом в момент создания ComboBox определять, на какую все таки таблицу ссылается внешний ключ.
Я вот вчера как раз этот вариант пробовал, скрывал ключевые поля в гриде, привязывал их же к комбобоксам из второй формы, вроде бы, все нормально. Но только вот незадача: ключ-то я изменяю комбобоксом с привязкой, а неключевое поле, связанное с этим ключом, не меняется (КодРаботника меняется в представлении, а ФамилияРаботника нет).

А при создании DataRelation-ов придется же потом все равно вручную пересоздавать все столбцы грида, нет? Один грид на много таблиц, нужно будет удалять столбец внешнего ключа и создавать новый столбец с комбобоксом и привязкой по DataRelation для каждого внешнего ключа. Или же нет?
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
10.11.2013, 17:22
Цитата Сообщение от alex.gorbach Посмотреть сообщение
А при создании DataRelation-ов придется же потом все равно вручную пересоздавать все столбцы грида, нет?
Вручную, но это не сложно. Просто foreach'ем пробежаться по всем колонкам таблицы и если она содержит внешний ключ, то создать DataGridViewComboBoxColumn, иначе DataGridViewTextColumn. Получится универсальный метод для всех наборов данных размером около 10 строчек.
Цитата Сообщение от alex.gorbach Посмотреть сообщение
ключ-то я изменяю комбобоксом с привязкой, а неключевое поле, связанное с этим ключом, не меняется (КодРаботника меняется в представлении, а ФамилияРаботника нет)
У вас это неключевое поле не связано с этим ключом, поэтому и не меняется. Нужно вручную менять оба поля. Если пытаться реализоваться данным путем, то возникнет вопрос, какую таблицу цеплять в качестве источника к ComboBox. Переданная в форму строка данной информации содержать не будет, в отличии от метода с DataRelation.
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
10.11.2013, 23:55  [ТС]
Хм, вроде понял, а как начал делать - не получается. Данные не отображаются. Скрин и код метода прилагаются. Поглядите пожалуйста, где накосячил.
C#
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
private void createDataGridColumns(DataTable table)
        {
            dgvView.Columns.Clear();
            foreach(DataColumn col in table.Columns)
            {
                string relName = "FK_" + table.TableName + "_" + col.ColumnName;
                if(!libraryDataSet.Relations.Contains(relName))
                {
                    DataGridViewTextBoxColumn dcol = new DataGridViewTextBoxColumn();
                    dcol.DataPropertyName = col.ColumnName;
                    dcol.HeaderText = col.ColumnName;
                    dgvView.Columns.Add(dcol);
                }
                else
                {
                    DataGridViewComboBoxColumn dcol = new DataGridViewComboBoxColumn();
                    dcol.DataSource = libraryDataSet.Relations[relName].ParentTable;
                    dcol.DisplayMember = libraryDataSet.Relations[relName].ParentTable.Columns[1].ColumnName;
                    dcol.ValueMember = "Код";
                    dcol.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;
                    dcol.HeaderText = col.ColumnName;
                    dgvView.Columns.Add(dcol);
                }
            }
        }
http://2.firepic.org/2/images/... r3k6hm.jpg
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
13.11.2013, 18:08
alex.gorbach, Извиняюсь, что долго не заходил на форум. Если у вас не отображаются только комбо боксы, то это из-за того, что вы не инициализируете свойство DataPropertyName (не только в текстовом поле оно нужно). Если не отображается текст, значит нужно отладчиком проогонять, смотреть...
0
0 / 0 / 1
Регистрация: 08.09.2012
Сообщений: 35
14.11.2013, 22:19  [ТС]
kodv, спасибо за помощь, я уже разобрался, сделал все абсолютно по-другому. Правда, возник теперь такой вопрос: передаю в форму редактирования/добавления DataRow, он либо пустой, либо нет. Если добавляю запись - заполняю DataRow этот, все его значения, кроме поля Код, так как оно identity на сервере и при добавлении записи INSERT-ом я его не указываю, оно заполняется автоматически. Так вот, проблема в том, что когда пытаюсь сделать Table.Rows.Add(dataRow), вылетает исключение, мол, в поле Код запрещены NULL значения.
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
15.11.2013, 06:57
Цитата Сообщение от alex.gorbach Посмотреть сообщение
когда пытаюсь сделать Table.Rows.Add(dataRow), вылетает исключение, мол, в поле Код запрещены NULL значения.
Так вы задавайте какие-нибудь значения в поле [Код]. Обычно используют AutoIncrement с отрицтельным приращением (в смысле, для новых строк проставляются по очереди значения -1, -2, -3 и т.д.). После синхронизации с БД записывайте в поле [Код] значение, которое проставит ваша СУБД.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.11.2013, 06:57
Помогаю со студенческими работами здесь

Вопрос По Внедренному Представлению
Всем привет! Суть вопроса такова. Есть подформа, в ней - внедренное представление. В представлении на панели действий кнопка. Задача в...

Переход от 16- к 8-битовому представлению
В каких случаях возможен такой переход? Возможно перевести данные числа : 1) 160 2) 416 3) -448 ? Добавлено через 1...

Построить кривую по заданному параметрическому представлению:
Построить кривую по заданному параметрическому представлению: Строфоида: x=A*(t2–1) / (t2+1), y=A*t*(t2–1) / (t2+1), t(–∞,+∞), A>0

Построить кривые по заданному параметрическому представлению
Кто-то может объяснить как это сделать? Буду очень благодарен, если напишете программу)

Как подключить сторонний скрипт к представлению
Доброе утро, ув. форумчане. Скачал скрипт BxSlider. Как подключить его к представлению (не _Layot) Ниже прикрепил архив с файлами.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru