Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/30: Рейтинг темы: голосов - 30, средняя оценка - 4.73
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
1

Переписать процедуру с DatagridView в Datagrid

15.07.2019, 12:44. Показов 6235. Ответов 38

Author24 — интернет-сервис помощи студентам
Всем привет!
Есть процедура, работающая С Datagridveiw
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
    Private Sub Add_IP(ByVal values As List(Of String))
 
        If Me.DataGridView1.InvokeRequired Then
            Dim d As New SetDatapointCallback(AddressOf Add_IP)
            Me.Invoke(d, New Object() {values})
        Else
            Dim editrow As Boolean = False
            For Each row As DataGridViewRow In DataGridView1.Rows
                If row.Cells(0).Value.ToString() = values(0) Then
                    For i As Integer = 1 To values.Count - 1
                        If values(i) <> "-" Then
                            row.Cells(i).Value = values(i)
                        End If
                        If i = 3 AndAlso values(3) = "Available" Then
                            row.Cells(i).Style.BackColor = Color.LightGreen
                        End If
                        If i = 4 AndAlso values(4) = "Available" Then
                            row.Cells(i).Style.BackColor = Color.LightGreen
                        End If
                        If i = 5 AndAlso values(5) = "HTTPS Available" Then
                            row.Cells(i).Style.BackColor = Color.LightGreen
                        End If
                        If i = 5 AndAlso values(5) = "Available" Then
                            row.Cells(i).Style.BackColor = Color.Yellow
                        End If
                    Next i
                    editrow = True
                End If
            Next row
 
            If Not editrow Then
                Try
                    DataGridView1.Rows.Add(values(0), values(1), values(2), values(3), values(4), values(5))
                Catch ex As Exception
                    Exit Sub
                End Try
            End If
        End If
    End Sub
Как можно преобразовать и запустить эту процедуру с другим элементом управления - обычным DataGeid (предшественником Datagridview)?

Заранее спасибо за помощь!
Миниатюры
Переписать процедуру с DatagridView в Datagrid  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2019, 12:44
Ответы с готовыми решениями:

Вывод в Datagrid и DataGridView
Здравствуйте! Я только недавно начал изучать C#, сейчас интересует работа с БД (через ODBC), как...

WindowsForms. DataGrid и DataGridView
В плохом и уставшем настроении сразу после болезни бросился я читать мануалы по этим штукам. И......

Переписать процедуру в transact
CREATE PROCEDURE ChildDeptsList (pDeptID integer) RETURNS (rDeptFullName varchar(100)) AS BEGIN...

Переписать процедуру в функцию
Не получается правильно переписать процедуру в функцию, помогите пожалуйста. var n:longint;...

38
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
15.07.2019, 17:59  [ТС] 2
Переделал вроде.
Ругается на:
VB.NET
1
 For Each row As DataGridViewRow In dtstudent.Rows
System.InvalidCastException произошло
HResult=0x80004002
Сообщение = Не удалось привести тип объекта "System.Data.DataRow" к типу "System.Windows.Forms.DataGridViewRow".
0
Лень — мое второе и
3206 / 2397 / 684
Регистрация: 28.11.2014
Сообщений: 3,587
Записей в блоге: 3
15.07.2019, 18:05 3
_Alf_, ну так обьявите row как System.Data.DataRow, а не System.Windows.Forms.DataGridViewRow
0
1978 / 1411 / 366
Регистрация: 26.06.2017
Сообщений: 4,012
15.07.2019, 18:13 4
Ну сделайте так:
VB.NET
1
For Each row As DataRow In dtstudent.Rows
А чем DataGridView не угодил?
0
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
16.07.2019, 11:08  [ТС] 5
Uswer, да пробовал так
Везде где row.Cells вываливается на ошибку
VB.NET
1
  If row.Cells(0).Value.ToString() = values(0) The
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка BC30456 "Cells" не является членом "DataRow". WindowsApp50

P/s а надо это для вложенного datagrid: (https://www.c-sharpcorner.com/... dow-forms/)

Orlangur1991, вот так?
VB.NET
1
Dim row As DataRow
подправте, если не так.

Добавлено через 1 час 51 минуту
Вот так тоже пробовал.
VB.NET
1
2
 Dim row As DataRow
For Each row In dtstudent.Rows
Ошибка та же. Cells не является членом DataRow

Добавлено через 21 минуту
Этот вопрос снят. Переделал. Получилось вот так вот:

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
 Private Sub Add_IP(ByVal values As List(Of String))
 
        If Me.DataGrid1.InvokeRequired Then
                Dim d As New SetDatapointCallback(AddressOf Add_IP)
                Me.Invoke(d, New Object() {values})
            Else
                Dim editrow As Boolean = False
 
            For Each row As DataRow In dtstudent.Rows
                If row(0) = values(0).ToString Then
                    For i As Integer = 1 To values.Count - 1
                        If values(i) <> "-" Then
                            row(i) = values(i)
                        End If
                        If i = 3 AndAlso values(3) = "Available" Then
                            'row(i).Style.BackColor = Color.LightGreen
                        End If
                        If i = 4 AndAlso values(4) = "Available" Then
                            'row(i).BackColor = Color.LightGreen
                        End If
                        If i = 5 AndAlso values(5) = "HTTPS Available" Then
                            'row(i).Style.BackColor = Color.LightGreen
                        End If
                        If i = 5 AndAlso values(5) = "Available" Then
                            ' row(i).Style.BackColor = Color.Yellow
                        End If
                    Next i
                    editrow = True
                End If
            Next row
 
            If Not editrow Then
                    dtstudent.Rows.Add(values(0), values(1), values(2), values(3), values(4), values(5))
                End If
            End If
 
    End Sub
Единственное, что закраска ячеек не работает. Может кто подскажет, как закрашивать ячейки правильно.
0
Лень — мое второе и
3206 / 2397 / 684
Регистрация: 28.11.2014
Сообщений: 3,587
Записей в блоге: 3
16.07.2019, 11:11 6
_Alf_, в ссылке, что вы прикладывали показано, что работа происходит с DataTable, после чего эта DataTable указывается как DataSource для DataGrid, соответственно, работайте с DataTable
1
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
16.07.2019, 11:19  [ТС] 7
Orlangur1991, спасибо. буду разбираться дальше
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
16.07.2019, 14:51 8
Пример отображения Master-Detail в DataGrid посмотрите здесь Группировка в DataGridView
1
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
17.07.2019, 22:43 9
Лучший ответ Сообщение было отмечено _Alf_ как решение

Решение

Реализация Master-Detail для DataGridView (https://www.codeproject.com/Ti... tagridview). Немного подредактировал и оформил как DLL, так удобней в использовании. Прикладываю пример использования. Среда: vs2017.
Миниатюры
Переписать процедуру с DatagridView в Datagrid  
Вложения
Тип файла: rar dgvMD.rar (128.6 Кб, 15 просмотров)
5
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
18.07.2019, 09:23  [ТС] 10
ovva, спасибо!
Пример просто супер! Буду разбираться и пытаться перепиливать под себя.
Только одно но. тут все на Базе данных. А как скажем данные получить из текстового файла?
или переместить из обычного datagridview?
0
2 / 2 / 0
Регистрация: 19.04.2019
Сообщений: 58
18.07.2019, 11:27 11
ovva, Пример действительно классный. Вот у меня возник такой вопрос, а можно ли сделать так, чтобы в второй открывающейся таблице также открывалась другая таблица. т. есть третья таблица должна открываться как вторая. Только из второй таблицы?
0
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
18.07.2019, 15:36  [ТС] 12
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
24
25
26
27
28
29
30
31
32
33
 Panel1.Controls.Clear()
        md = Nothing
        Refresh()
        md = New MasterControl(ds)
        Panel1.Controls.Add(md)
 
        Dim file As New System.IO.StreamReader("D:\test.txt")
        Dim dt As New DataTable()
 
        dt.Columns.Add("Фамилия")
        dt.Columns.Add("Имя")
        dt.Columns.Add("Отчество")
        dt.Columns.Add("Телефон")
        dt.Columns.Add("Адрес")
     
        Dim newline As String
        newline = file.ReadLine()
 
        Do While newline IsNot Nothing
            Dim dr As DataRow = dt.NewRow()
            Dim values() As String = newline.Split("|"c)
            For i As Integer = 0 To values.Length - 1
                dr(i) = values(i)
            Next i
            dt.Rows.Add(dr)
            newline = file.ReadLine()
        Loop
        file.Close()
        md.DataSource = dt
 
 
        '  md.childView.Add("Orders", "Orders")
        '  md.childView.Add("Invoices", "Invoices")
А как теперь сделать вложенную таблицу?, создать ей столбцы, и вбить какие-нибудь данные (можно кодом, для примера)
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
18.07.2019, 19:21 13
Лучший ответ Сообщение было отмечено _Alf_ как решение

Решение

Цитата Сообщение от _Alf_ Посмотреть сообщение
тут все на Базе данных. А как скажем данные получить из текстового файла?
или переместить из обычного datagridview?
Пример с двумя смоделированными таблицами. Вы можете аналогичным образом сформировать ваши таблицы из текстового файла, из сетки и т.д.
Кликните здесь для просмотра всего текста
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
57
58
59
60
61
62
63
64
Imports dgvMasDet
Public Class Form1
    Private md As MasterControl
    Private ds As DataSet
    Private dtm, dtd As DataTable
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'моделируются две таблицы
        dtm = CreateTableMaster()
        dtd = CreateTableDetail()
        ds = New DataSet
        ds.Tables.Add(dtm)
        ds.Tables.Add(dtd)
    End Sub
    Private Sub DGV_Show_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Panel1.Controls.Clear()
        md = Nothing
        Refresh()
        md = New MasterControl(ds)
        Panel1.Controls.Add(md)
        md.setParentSource("Famil", "IdF")
        md.childView.Add("Place", "Placement")
    End Sub
    Private Function CreateTableMaster() As DataTable
        Dim tb As New DataTable
        tb.Columns.Add("IdF", System.Type.GetType("System.Int32"))
        tb.Columns.Add("Fam", System.Type.GetType("System.String"))
        tb.Columns.Add("Tel", System.Type.GetType("System.String"))
        tb.PrimaryKey = {tb.Columns(0)}
        Dim rr As DataRow
        Dim rnd As New Random
        Dim fm() As String = {"Иванов", "Петров", "Степанов", "Цветков", "Чазов", "Мельников", "Комаров", "Аганесов", "Ибрагимов", "Бабушкин"}
        For i = 1 To 50
            rr = tb.NewRow
            rr.Item(0) = i
            rr.Item(1) = fm(rnd.Next(0, fm.Length))
            rr.Item(2) = rnd.Next(101, 200).ToString & "-" & rnd.Next(100, 999).ToString & "-" & rnd.Next(100, 999).ToString
            tb.Rows.Add(rr)
        Next
        tb.TableName = "Famil"
        Return tb
    End Function
    Private Function CreateTableDetail() As DataTable
        Dim tb As New DataTable
        tb.Columns.Add("ID", System.Type.GetType("System.Int32"))
        tb.Columns.Add("IdF", System.Type.GetType("System.Int32"))
        tb.Columns.Add("Name", System.Type.GetType("System.String"))
        tb.Columns.Add("Town", System.Type.GetType("System.String"))
        tb.PrimaryKey = {tb.Columns(0)}
        Dim rr As DataRow
        Dim rnd As New Random
        Dim nm() As String = {"Владимир", "Алексей", "Олег", "Петр", "Иван", "Степан", "Александр", "Виктор", "Павел", "Сергей"}
        Dim tn() As String = {"Москва", "Владимир", "Казань", "Смоленск", "Рязань", "Омск", "Новосибирск", "Якутск", "Хабаровск", "Магадан"}
        For i = 1 To 50
            rr = tb.NewRow
            rr.Item(0) = i
            rr.Item(1) = rnd.Next(1, 51)
            rr.Item(2) = nm(rnd.Next(0, nm.Length))
            rr.Item(3) = tn(rnd.Next(0, tn.Length))
            tb.Rows.Add(rr)
        Next
        tb.TableName = "Place"
        Return tb
    End Function
End Class
Миниатюры
Переписать процедуру с DatagridView в Datagrid  
2
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
19.07.2019, 09:14  [ТС] 14
ovva, Спасибо. И еще вопросик:
Можно ли сделать вторая(вложенная) таблица была по содержимому? без пустого места?
Миниатюры
Переписать процедуру с DatagridView в Datagrid  
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
19.07.2019, 14:40 15
Цитата Сообщение от _Alf_ Посмотреть сообщение
Можно ли сделать вторая(вложенная) таблица была по содержимому? без пустого места?
В данном решении окно таблиц Detail имеет постоянный размер по высоте (примерно 9 строк). Его можно сделать больше или меньше, но этот параметр не зависит от количества выводимых строк. Думаю, что это можно сделать, но у меня нет возможности заниматься этим сейчас. Вы сами можете поработать над этой задачей, взяв код из статьи указанной в начале обсуждения.
В качестве быстрого решения уменьшил высоту окна до 5 строк.
Вложения
Тип файла: rar dgvMasDet.rar (9.4 Кб, 4 просмотров)
1
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
22.07.2019, 12:20  [ТС] 16
ovva, подскажите, как как можно обработать какое нибудь событие?
на примере обычного datagrida:
VB.NET
1
2
3
    Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
 
    End Sub
как переписать на данный dvg?

Добавлено через 40 минут
ovva, и как править количество строк?
можно его уменьшить до 1 строки?
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
22.07.2019, 21:04 17
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub DGV_Show_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Panel1.Controls.Clear()
    md = Nothing
    Refresh()
    md = New MasterControl(ds, 3) 'по умолчанию 5
    Panel1.Controls.Add(md)
    md.setParentSource("Famil", "IdF")
    md.childView.Add("Place", "Placement")
    AddHandler md.CellContentClick, AddressOf CellContent_Click 'относится к окну Master
End Sub
Private Sub CellContent_Click(sender As Object, e As DataGridViewCellEventArgs)
    MsgBox(e.RowIndex + 1 & ", " & e.ColumnIndex + 1)
End Sub
Вложения
Тип файла: rar dgvMasDet.rar (9.3 Кб, 13 просмотров)
1
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
23.07.2019, 16:14  [ТС] 18
ovva, подскажите еще, пожалуйста одну штуку.
вот я заполнил главную таблицу (предположим из текстового файла)
По клику по записи определяю № (поле IdF) и заношу его в label1 и первый столбец (скажем ФИО) в label2
VB.NET
1
2
3
4
5
6
7
8
9
 Private Sub CellContent_Click(sender As Object, e As DataGridViewCellEventArgs)
 
 
        If md.Rows(e.RowIndex).Cells(0).Value IsNot Nothing Then
            Label1.Text = (md.Rows(e.RowIndex).Cells(0).Value.ToString())
            Label2.Text = (md.Rows(e.RowIndex).Cells(1).Value.ToString())
        End If
 
end sub
Так вот.
мне необходимо заполнять дочернюю таблицу (вложенную) в зависимости от выбранной записи и ФИО.
То есть скажем если запись под номером 1 и Фио: Иванов И.И., то в дочернюю таблицу необходимо занести данные из текстовых полей (их 3) и отобразить эти данные во вложенной таблицы.
Если выбран № 2 и фио Сидоров А.А, данные в текстовых полях меняются, и соответственно заносится во вложенную таблицу под строку №2
Если выбран № 3 и фио Александров В.С, данные в текстовых полях меняются, и соответственно заносится во вложенную таблицу под строку №3 и т.д.

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

Спасибо.

Добавлено через 6 минут
Пытаюсь сделать так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   Private Function CreateTableDetail() As DataTable
        Dim tb As New DataTable
 
        tb.Columns.Add("IdF", System.Type.GetType("System.String"))
        tb.Columns.Add("ФИО", System.Type.GetType("System.String"))
        tb.Columns.Add("Адрес", System.Type.GetType("System.String"))
        tb.Columns.Add("Отдел", System.Type.GetType("System.String"))
        tb.Columns.Add("Раб. телефон", System.Type.GetType("System.String"))
  
        tb.PrimaryKey = {tb.Columns(0)}
 
        tb.Rows.Add(Label1.Text, Label2.Text, TextBox1.Text, TextBox2.Text, TextBox3.Text)
 
        tb.TableName = "Place"
        Return tb
    End Function
но у меня вложенная таблица получается пустая.
Видимо надо формировать вторую таблицу по клику в
VB.NET
1
Private Sub CellContent_Click(sender As Object, e As DataGridViewCellEventArgs)
но что то не допру как.
прошу помочь разобраться.

Добавлено через 55 секунд
label1 - Idf
label2 - ФИО
Textbox1.text - Адрес
Textbox2.text - Отдел
Textbox3.text - Раб. телефон
0
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
23.07.2019, 23:02 19
_Alf_, не нужно все вопросы сваливать в одну корзину. Задачу можно разделить на формирование данных и отображение сформированных данных. Не поленился и написал простой пример (VS2017).
Вложения
Тип файла: rar MDExample.rar (25.9 Кб, 11 просмотров)
1
2 / 2 / 0
Регистрация: 18.12.2018
Сообщений: 392
25.07.2019, 11:27  [ТС] 20
ovva, извините меня, но остался последний вопрос:
как удалить вложенную таблицу и создать ее заново?

делаю так.
VB.NET
1
2
3
 ds.Tables.Remove("Wor")
        dtD.Rows.Clear()
        dtD.Columns.Clear()
но в итоге получается:
Миниатюры
Переписать процедуру с DatagridView в Datagrid  
0
25.07.2019, 11:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2019, 11:27
Помогаю со студенческими работами здесь

Переписать процедуру на функцию
uses crt; var mas:array of real; i,j,x,y:integer; begin clrscr; write('Кол-во строк: ');...

Заполнение datagridview или datagrid
Подскажите, пожалуйста, каким образом заполнять datagridview или datagrid, если данные в каждом...

Переписать под функцию процедуру
Хочу переписать под функцию процедуру: procedure podschet(a:mas;n,c:integer;var k:integer); var...

Переписать процедуру под функцию
Нужно переписать следующий алгоритм нахождения седловой точки матрицы под функцию. Пробовал, не...

Переписать код под процедуру
Помогите...нужно в этом коде использовать где-нибудь &quot;процедуру&quot;! var A : array of byte; M,...

Не могу переписать процедуру в функцию
Процедуру написал , а тут вышла проблемка:help: Var A:array of integer; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru