Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1

Передача изменённой строки DataTable в событии

15.10.2019, 09:53. Показов 1204. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.
Есть такой класс:
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Class MyClass
  Public Name As String
  Dim inRow As DataRow
 
  Property myRow() As DataRow
    Get
      Return inRow
    End Get
    Set(ByVal value As DataRow)
      inRow = value
      AddHandler inRow.Table.RowChanged, New DataRowChangeEventHandler(AddressOf changeName)
    End Set
  End Property
 
  Sub changeName(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
    Name = inRow(0)
  End Sub
End Class


Использование:
Кликните здесь для просмотра всего текста
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim lb1, lb2, lb3 As MyClass
Dim tdt As DataTable
' заполнение таблицы данными
 
lb1 = New MyClass
lb1.Name = "LB1"
lb1.myRow = tdt.Rows(0)
 
lb2 = New MyClass
lb2.Name = "LB2"
lb2.myRow = tdt.Rows(1)
 
lb3 = New MyClass
lb2.Name = "LB3"
lb3.myRow = tdt.Rows(2)
 
tdt.Rows(0)(0) = "222" ' При изменении содержимого строки меняется и имя экземпляра MyClass

Как бы всё работает, но есть одно НО, которое меня тревожит. Дело в том, что при изменении любой строки таблицы tdt метод changeName срабатывает для всех экземпляров класса MyClass.
Как сделать так, чтобы метод changeName срабатывал только для того экземпляра класса MyClass, к которому привязана изменяющаяся строка (в моём примере это Row(0))?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2019, 09:53
Ответы с готовыми решениями:

Можно получить id измененной строки?
Здравствуйте! Скажите пожалуйста. На Sql Server можно получить id только что изменившего строка? Если да, как? Спасибо!

Передача DataTable клиенту
Здравствуйте!Помогите плиз разобраться с клиент-серверным приложением. Сервер получает SQL запрос от клиента через сокет, затем этот...

Передача DataTable клиенту
Здравствуйте, вот проблема: На сервере: public interface IImportdata { DataTable...

7
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
15.10.2019, 21:50
VB.NET
1
2
3
4
5
    Sub changeName(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
        If inRow Is e.Row Then
            Name = inRow(0), String
        End If
    End Sub
Вообще это конечно жуть. В каждом экземпляре будет вызываться событие в пустоту. За такое ремня можно было бы получить...

Надеюсь это упрощённый вариант кода для вопроса.

Предлагаю следующий вариант c более оптимальным обращением, сохраняя ваш замысел

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
Class MyClass1
    Public Name As String
    Dim inRow As DataRow
 
    Private Shared s_dictRowMyClass1 As New Dictionary(Of DataRow, MyClass1) 'общая коллекция строк на экземпляры классов MyClass1
    Private Shared s_tables As New List(Of DataTable) 'коллекция таблиц, участвующих в обработке (если не одна)
 
    Property myRow() As DataRow
        Get
            Return inRow
        End Get
        Set(ByVal value As DataRow)
            'в случае если попытаемся присвоить экземпляр строки к другому классу обработчику
            If inRow IsNot Nothing Then
                s_dictRowMyClass1.Remove(inRow)
            End If
 
            inRow = value
 
            s_dictRowMyClass1.Add(inRow, Me)
 
            Dim tbl As DataTable = inRow.Table
 
            'для каждой таблицы (если она не одна) будет присвоен один обработчик события
            If Not s_tables.Contains(tbl) Then
                s_tables.Add(tbl)
                AddHandler tbl.RowChanged, New DataRowChangeEventHandler(AddressOf RowChange)
            End If
 
        End Set
    End Property
 
    Private Shared Sub RowChange(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
        'поиск в общих коллекция ссылки Row на экземпляр класса MyClass1 и делаем вызов в changeName
        Dim row As DataRow = e.Row
        If s_dictRowMyClass1.ContainsKey(row) Then
            s_dictRowMyClass1(row).changeName(sender, e)
        End If
        'требуется учитывать, что для каждой обрабатываемой Row должен быть свой MyClass1
    End Sub
 
    Private Sub changeName(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
        Name = CType(inRow(0), String)
    End Sub
End Class
2
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
16.10.2019, 09:53  [ТС]
Цитата Сообщение от Sklifosofsky Посмотреть сообщение
Надеюсь это упрощённый вариант кода для вопроса.
Естественно, он вообще далёк от реального кода

В вопросе я слукавил, есть ещё один класс, примерно такой:
VB.NET
1
2
3
4
Public Class MyClasses
  Inherits BindingList(Of MyClass)
  ...
End Class
как видно он описывает список экземпляров первого класса и по идее надо бы увязать передачу события в этом классе, но что-то не соображу как не поможете?
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
16.10.2019, 22:19
Не пойму. Хотите вместо DataTable использовать BindingList?
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
17.10.2019, 08:25  [ТС]
Нет, таблица существует сама по себе. Экземпляр класса MyClass содержит ссылку на строку таблицы, а класс MyClasses содержит список экземпляров MyClass (MyClasses.Items). Нужно при изменении строки таблицы вызвать процедуру изменения имени того экземпляра MyClass, который содержит ссылку на эту строку.
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
17.10.2019, 19:26
Так что ли хотите видеть?

VB.NET
1
2
3
4
5
6
7
8
9
10
Public Class MyClasses
  Inherits BindingList(Of MyClass)
 
   '???
 
  Public Sub NameChanged(ChangeMyClass As MyClass)
      'ваш код
  End Sub
 
End Class
0
2285 / 1601 / 400
Регистрация: 26.06.2017
Сообщений: 4,744
Записей в блоге: 1
17.10.2019, 21:35  [ТС]
Ну-у, да.
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
18.10.2019, 18:50
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
    Public Class MyClasses
        Inherits BindingList(Of MyClass1)
 
        Protected Overrides Sub OnListChanged(e As ListChangedEventArgs)
            'указываем дочернему элементу родителя
            If e.ListChangedType = ListChangedType.PropertyDescriptorAdded Then
                Me(e.NewIndex).Owner = Me
            End If
        End Sub
 
        Protected Overrides Sub RemoveItem(index As Integer)
            'исключаем родителя при удалении по одному
            Me(index).Owner = Nothing
            MyBase.RemoveItem(index)
        End Sub
 
        Protected Overrides Sub ClearItems()
            'исключаем родителей у всей коллекции при очистке
            For Each m As MyClass1 In Me
                m.Owner = Nothing
            Next
            MyBase.ClearItems()
        End Sub
 
        Public Sub NameChanged(ChangeMyClass As MyClass1)
            'ваш код
        End Sub
 
    End Class
 
    Class MyClass1
        Public Owner As MyClasses 'родительский элемент
        Public Name As String
        Public inRow As DataRow
 
        Private Shared s_dictRowMyClass1 As New Dictionary(Of DataRow, MyClass1) 'общая коллекция строк на экземпляры классов MyClass1
        Private Shared s_tables As New List(Of DataTable) 'коллекция таблиц, участвующих в обработке (если не одна)
 
        Property myRow() As DataRow
            Get
                Return inRow
            End Get
            Set(ByVal value As DataRow)
                'в случае если попытаемся присвоить экземпляр строки к другому классу обработчику
                If inRow IsNot Nothing Then
                    s_dictRowMyClass1.Remove(inRow)
                End If
 
                inRow = value
 
                s_dictRowMyClass1.Add(inRow, Me)
 
                Dim tbl As DataTable = inRow.Table
 
                'для каждой таблицы (если она не одна) будет присвоен один обработчик события
                If Not s_tables.Contains(tbl) Then
                    s_tables.Add(tbl)
                    AddHandler tbl.RowChanged, New DataRowChangeEventHandler(AddressOf RowChange)
                End If
 
            End Set
        End Property
 
        Private Shared Sub RowChange(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
            'поиск в общих коллекция ссылки Row на экземпляр класса MyClass1 и делаем вызов в changeName
            Dim row As DataRow = e.Row
            If s_dictRowMyClass1.ContainsKey(row) Then
                s_dictRowMyClass1(row).changeName(sender, e)
            End If
            'требуется учитывать, что для каждой обрабатываемой Row должен быть свой MyClass1
        End Sub
 
        Private Sub changeName(ByVal sender As Object, ByVal e As DataRowChangeEventArgs)
            Name = CType(inRow(0), String)
 
            If Owner IsNot Nothing Then
                Owner.NameChanged(Me) 'вызов и передача метода в родительский элемент
            End If
        End Sub
    End Class
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2019, 18:50
Помогаю со студенческими работами здесь

Передача клиенту DataTable с использованием XmlSerializer
Добрый вечер. Формирование таблицы. public static DataTable GetData(string query) { DataSet ds = new...

Передача значений из DataTable в процедуру PL/SQL
Добрый день! Подскажите пожалуйста, как передать из DataTable все значения из столбца Id в процедуру SQL. И как оформить эту...

Передача DataTable по ссылке в фоновый процесс BackgroundWorker
В классе формы создаётся DataTable, а в обработчике buttonExport_Click создаётся BackgroundWorker и параметры для него, при его запуске...

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

Передача типа DataTable в качестве параметра в хранимой процедуры
Всем доброго вечера. Прощу Вашей помощи. Проблема следующая: есть множество таблиц в базе данных, у таблиц есть 5 одинаковых полей, которые...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru