Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533

Объединение нескольких таблиц перед выводом в DataGridView

08.12.2015, 10:39. Показов 3501. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с такой проблемой. Вывожу из xml файла таблицы. Хочу вывести несколько таблиц, которые есть в xml файл в один datagridview. имя выбранного файла берется из текстового поля. делаю это так:
код кнопки:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
      Dim _FilePath As String = TextBox1.Text
 
        Dim DataSet1 As New DataSet
        DataSet1.ReadXml(_FilePath)
 
        Dim DataSet2 As New DataSet
        DataSet2.ReadXml(_FilePath)
 
 
        Dim DataSet3 As New DataSet
        DataSet3.ReadXml(_FilePath)
 
 
        Dim aggregateTable As New DataTable("AggTbl")
        aggregateTable.Merge(DataSet1.Tables(15))
        aggregateTable.Merge(DataSet2.Tables(16))
        aggregateTable.Merge(DataSet3.Tables(17))
        Me.DataGridView1.DataSource = aggregateTable
и при нажатии на кнопку выдает такую ошибку: (см. вложения).
если выводить отдельно в другой DataGridView2, так:
VB.NET
1
2
3
        Dim DataSet3 As New DataSet
        DataSet3.ReadXml(_FilePath)
        DataGridView2.DataSource = DataSet3.Tables(17)
то всё выводится хорошо, никаких ошибок. объясните что не так?
и еще вопрос, можно ли игнорировать ошибки с пустыми данными в таблицы из коллекции таблиц DataSet, т.е. если есть где то в таблице пустые данные, что бы он все равно выводил эту таблицу?
заранее спасибо за помощь.
Миниатюры
Объединение нескольких таблиц перед выводом в DataGridView  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.12.2015, 10:39
Ответы с готовыми решениями:

Объединение нескольких dataSet и отображение в dataGridView
Доброго времени суток всем! Пытаюсь объединить несколько dataSet'ов в один, результат отобразить в dataGridView таким способом: ...

Update нескольких таблиц в DataGridView
Помогите плиз в проблеме.. Суть проста- есть 2-3 таблицы в базе SQL. Нужно вывести их содержимое в Датагрид, связав их по определенным...

Отображение нескольких таблиц из базы данных SQL в DataGridView
Как создать отображение нескольких таблиц из базы данных SQL в DataGridView?

14
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
08.12.2015, 20:00
Каждый DataSet имеет свою коллекцию таблиц. Похоже, что здесь вы обращаетесь к таблице, которой нет в коллекции. Если DataGridView2.DataSource = DataSet3.Tables(17) выполняется корректно, то в DataSet3 должно быть, по крайней мере, 18 таблиц. Проверьте сколько таблиц храниться в каждом DataSet и что они из себя представляют.
Объединяемые таблицы должны иметь похожие схемы.
Если судить по приведенному коду, то каждый DataSet заполняется одинаковым набором таблиц. В этом случае м.б. использовать DataSet.Copy. Ну и если набор таблиц одинаков, зачем выбирать таблицы из трех DataSet и зачем вообще нужно три DataSet.
Проверяйте aggregateTable после каждого пополнения.
Слишком мало содержательной информации, чтобы дать какие-либо конкретные советы.
1
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533
09.12.2015, 09:04  [ТС]
ovva,
Цитата Сообщение от ovva Посмотреть сообщение
В этом случае м.б. использовать DataSet.Copy.
а можно пример?
0
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533
09.12.2015, 10:57  [ТС]
ovva,
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 Dim _FilePath As String = TextBox1.Text
 
        Dim DataSet1 As New DataSet
        DataSet1.ReadXml(_FilePath)
        DataGridView1.DataSource = DataSet1.Tables(15)
 
        Dim DataSet2 As New DataSet
        DataSet2.ReadXml(_FilePath)
        DataGridView2.DataSource = DataSet2.Tables(16)
 
 
        Dim DataSet3 As New DataSet
        DataSet3.ReadXml(_FilePath)
        DataGridView3.DataSource = DataSet3.Tables(18)
 
 
        Dim aggregateTable As New DataTable("AggTbl")
 
        aggregateTable.Merge(DataSet1.Copy.Tables(15))
        aggregateTable.Merge(DataSet2.Copy.Tables(16))
        aggregateTable.Merge(DataSet3.Copy.Tables(18))
 
        Me.DataGridView4.DataSource = aggregateTable
вывел все DataSet в свои DataGridView, пытаюсь собрать теперь все в одной таблице, но теперь выдает такую ошибку.
правильно делаю? или нет?
ругается вот на эту строку:
VB.NET
1
aggregateTable.Merge(DataSet3.Copy.Tables(18))
таблица есть, и она заполнена полностью. проверял. отдельно в свой DataGridView она выводиться.
Миниатюры
Объединение нескольких таблиц перед выводом в DataGridView  
0
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533
09.12.2015, 12:13  [ТС]
ovva, он почему то вот так вот объединят теперь.
Миниатюры
Объединение нескольких таблиц перед выводом в DataGridView  
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
09.12.2015, 13:36
Приведите пример данных которые вы пытаетесь загружать через DataSet1.ReadXml(_FilePath).

Добавлено через 7 минут
Метод DataSet.Copy копирует структуру и данные DataSet-источник в DataSet-приемник. Например
VB.NET
1
Dim copyDataSet1 As DataSet = dataSet1.Copy()
0
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533
10.12.2015, 11:31  [ТС]
Прикрепляю файл xml, с которым я работаю.
пробовал объединять таблицы 15 и 16
VB.NET
1
2
3
4
5
6
  Dim aggregateTable As New DataTable("AggTbl")
 
        aggregateTable.Merge(DataSet1.Copy.Tables(15))
        aggregateTable.Merge(DataSet2.Copy.Tables(16))
  
        Me.DataGridView4.DataSource = aggregateTable
объединяет хорошо, выводит в datagriview4,
а если добавить 18 таблицу, то уже выдает ошибку (прикрепил сообщением ранее)
пробовал объединять 15 и 18, 16 и 18, объединяет, но выводит криво (так же скирн прикрепил сообщением ранее).
а все вместе, все 3 таблицы он не объединяет.
буду благодарен, если поможете мне разобраться с этой проблемой. заранее спасибо!
Вложения
Тип файла: zip 6.zip (1.6 Кб, 16 просмотров)
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
10.12.2015, 15:44
В xml-файле у вас хранится копия базы данных на какой-то момент. Чтобы правильно загрузить ее в DataSet нужно иметь т.н. xml-схему (это файл с расширением xsd, или группа файлов). Думается, что эту схему можно поискать, например, на сайте ПФ.
Теперь к ситуации когда такой схемы нет. При загрузке в DataSet образуется 19 таблиц. Возможно, что в схеме предусматривается хранение информации, которой в данном файле просто нет, т.е. при загрузке другого файла таблиц может оказаться 20 или 22. Поэтому в коде лучше пользоваться именами таблиц. Так таблица с индексом 15 это "СведенияОполучателе", таблица 16 – "ФИО", таблица 17 – "ВсеВыплаты" и таблица 18 – "Выплата". То, что таблицы 15 и 16 объединились так как нужно, скорее исключение. Для данных произвольного вида типичный результат это то, что вы привели на рисунке. Таблицы 15 и 16 имеют общий идентификатор поле "СведенияОполучателе_Id" именно по нему и было выполнено объединение. Таблица 18 такого поля не имеет, но имеет поле "ВсеВыплаты_Id". Связь между "СведенияОполучателе_Id" и "ВсеВыплаты_Id" зафиксирована в таблице 17. Таким образом, таблицы 15 и 16 можно объединить через Merge, а таблицу 18 добавить через код с использованием информации из таблицы 17.
1
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533
10.12.2015, 16:13  [ТС]
ovva,
а можно пример?, вы все так доступно описали, я все понял, только вот не знаю как это сделать!?
заранее спасибо!
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
10.12.2015, 16:46
Лучший ответ Сообщение было отмечено bd_13 как решение

Решение

Думаю, этот код вам поможет.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    DataGridView1.DataSource = mergeTabs()
End Sub
Private Function mergeTabs() As DataTable
    Dim xmlFile As XmlReader
    Dim settings As XmlReaderSettings = New XmlReaderSettings()
    settings.IgnoreComments = True
    settings.IgnoreProcessingInstructions = True
    settings.IgnoreWhitespace = True
    xmlFile = XmlReader.Create(".\xmlData\6.xml", settings)  '\bin\Debug\xmlData\6.xml
    Dim ds As New DataSet
    ds.ReadXml(xmlFile)
    Dim tbNew As New DataTable
    tbNew.Merge(ds.Tables("СведенияОполучателе")) '15
    tbNew.Merge(ds.Tables("ФИО")) '16
    tbNew.PrimaryKey = New DataColumn() {tbNew.Columns("СведенияОполучателе_Id")}
    Dim tbNew2 As New DataTable
    tbNew2.Merge(ds.Tables("ВсеВыплаты")) '17
    tbNew2.Merge(ds.Tables("Выплата")) '18
    tbNew2.PrimaryKey = New DataColumn() {tbNew2.Columns("СведенияОполучателе_Id")}
    tbNew.Merge(tbNew2, False, MissingSchemaAction.Add)
    Return tbNew
End Function
1
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533
10.12.2015, 17:10  [ТС]
ovva, спасибо вам большое!) все получилось и все работает!!!
0
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533
20.01.2016, 13:05  [ТС]
ovva, пришлось вернуться к старой еще теме...
нашел косяк небольшой. все работает корректно, но не совсем так...
пожалуйста, вспомните эту тему.
прошу помощи еще вот в чем. вы помогли мне все сделать, только я не учел одну маленькую деталь. в файлике, который я вам давал у людей по одному виду выплаты. есть люди, у которых есть несколько выплат, по 2 выплаты, по 3 выплаты и т.д, ваш код выводит только одну последнюю выплату. а мне надо, что бы он выводил все выплаты. пример файла, с добавленными видами выплат я выкладываю. если посмотрите, то там я добавил к 1му человеку еще один вид выплаты, и к 3ему еще 3 выплаты.

как сделать не знаю, как будет лучше, либо пытаться вывести еще записи по выплате, либо добавить к записи столбцы с дополнительными выплатами.
Вложения
Тип файла: rar 6.rar (1.6 Кб, 14 просмотров)
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
20.01.2016, 20:33
По каждой выплате отдельная запись.
VB.NET
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
Private Function mergeTabs2() As DataTable
    Dim xmlFile As XmlReader
    Dim settings As XmlReaderSettings = New XmlReaderSettings()
    settings.IgnoreComments = True
    settings.IgnoreProcessingInstructions = True
    settings.IgnoreWhitespace = True
    xmlFile = XmlReader.Create(".\xmlData2\6.xml", settings)
    Dim ds As New DataSet
    ds.ReadXml(xmlFile)
    Dim tbNew1 As New DataTable
    tbNew1.Merge(ds.Tables("СведенияОполучателе")) '15
    tbNew1.Merge(ds.Tables("ФИО")) '16
    Dim tbNew2 As New DataTable
    With tbNew2.Columns
        .Add("СведенияОполучателе_Id", GetType(Integer))
        .Add("ВсеВыплаты_Id", GetType(Integer))
        .Add("ПризнакВыплаты", GetType(String))
        .Add("СуммаКвыплате", GetType(String))
        .Add("ДатаНачалаПериода", GetType(String))
        .Add("ДатаКонцаПериода", GetType(String))
        .Add("ВидВыплатыПоПЗ", GetType(String))
        .Add("НомерВмассиве", GetType(String))
        .Add("НомерВыплатногоДела", GetType(String))
        .Add("КодРайона", GetType(String))
        .Add("СтраховойНомер", GetType(String))
        .Add("НомерСчета", GetType(String))
        .Add("СуммаКдоставке", GetType(String))
        .Add("СПИСОК_НА_ЗАЧИСЛЕНИЕ_Id", GetType(Integer))
        .Add("Фамилия", GetType(String))
        .Add("Имя", GetType(String))
        .Add("Отчество", GetType(String))
    End With
    Dim vv1 As DataTable = ds.Tables("Выплата")
    Dim vv2 As DataTable = ds.Tables("ВсеВыплаты")
    Dim conbiVV = From v1 In vv1, v2 In vv2 Where v1!ВсеВыплаты_Id = v2!ВсеВыплаты_Id
    For Each rw In conbiVV
        tbNew2.Rows.Add(New Object() {rw.v2.Item("СведенияОполучателе_Id"), rw.v1.Item("ВсеВыплаты_Id"), _
            rw.v1.Item("ПризнакВыплаты"), rw.v1.Item("СуммаКвыплате"), rw.v1.Item("ДатаНачалаПериода"), _
            rw.v1.Item("ДатаКонцаПериода"), rw.v1.Item("ВидВыплатыПоПЗ")})
    Next
    For Each rw In tbNew2.Rows
        Dim jj As Integer = rw!СведенияОполучателе_Id
        Dim fio = From nr In tbNew1 Where nr!СведенияОполучателе_Id = jj
        rw!НомерВмассиве = fio(0).Item("НомерВмассиве")
        rw!НомерВыплатногоДела = fio(0).Item("НомерВыплатногоДела")
        rw!КодРайона = fio(0).Item("КодРайона")
        rw!СтраховойНомер = fio(0).Item("СтраховойНомер")
        rw!НомерСчета = fio(0).Item("НомерСчета")
        rw!СуммаКдоставке = fio(0).Item("СуммаКдоставке")
        rw!СПИСОК_НА_ЗАЧИСЛЕНИЕ_Id = fio(0).Item("СПИСОК_НА_ЗАЧИСЛЕНИЕ_Id")
        rw!Фамилия = fio(0).Item("Фамилия")
        rw!Имя = fio(0).Item("Имя")
        rw!Отчество = fio(0).Item("Отчество")
    Next
    Return tbNew2
End Function
1
222 / 175 / 73
Регистрация: 05.11.2015
Сообщений: 533
21.01.2016, 09:47  [ТС]
ovva, СПАСИБО)
все прекрасно работает!!! очень вам благодарен.
только вот в чем еще проблема...маленькие файлы открывает влет.
а вот большие файлы - виснет...можно ли с эти что нибудь сделать?
что бы не так долго висел?

Добавлено через 9 минут
или может какой-нибудь прогресс открытия попытаться сделать, что бы хоть видеть на сколько долго ждать?
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
21.01.2016, 23:55
Оптимизировать процедуру под большие файлы, не имея самих файлов как то не с руки.
Для начала попробуйте выявить наиболее затратные в плане времени блоки кода. Разделите весь код на логические блоки (3 - 5) и добавьте строки.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Dim str As String = ""
Dim sW As New Stopwatch
sW.Start()
'блок 1
sW.Stop()
str &= "p1=" & sW. ElapsedMilliseconds.ToString() & vbCrLf
sW.Restart()
'блок 2
sW.Stop()
str &= "p2=" & sW. ElapsedMilliseconds.ToString() & vbCrLf
sW.Restart()
'блок 3
'…
sW.Stop()
str &= "p5=" & sW. ElapsedMilliseconds.ToString() & vbCrLf
MsgBox(str)
PS
какой-нибудь прогресс
обсуждался на этом форуме не один раз, воспользуйтесь поиском.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.01.2016, 23:55
Помогаю со студенческими работами здесь

Предпросмотр документа перед выводом на печать
Здравствуйте! Подскажите пожалуйста, как в VB.NET 2008 сделать предпросмотр документа на форме перед выводом на печять документа,...

Ошибка с выводом данных из нескольких таблиц SQL
Всем добрый день/вечер, нуждаюсь в помощи знающих людей. Ошибка состоит в ошибке "Warning: Invalid argument supplied for foreach()...

Объединение столбцов из БД перед записью в datagridview
Здравствуйте опять! Вывожу данные из БД в datagridview. list="Select familia,imya,otchestvo from mail"; SqlDataAdapter...

Объединение нескольких таблиц
Доброго всем дня! Есть несколько таблиц с разным набором данных, например: Лицо (фамилия,имя ,отчество); Адрес (Город, улица, дом,...

Объединение нескольких таблиц
Доброго времени суток, товарищи. Помогите разобраться с БД. Необходимо создать объединение нескольких таблиц(результатом должна быть...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru