2014-01-22 6 views
0

У меня есть решение с несколькими datagridviews (DGV), а теперь несколько связующих источников (BS) и OleDbDataAdapters (ODA).Вспомните, какой DataAdapter из DataTable или DataSet

Это связано с тем, что у меня есть несколько DGV в элементе управления вкладкой, и я хочу показать разные таблицы из базы данных в каждом DGV, а также иметь возможность CRUD вернуться из DGV.

Используя одну BS и ODA, я смог показать все правильные таблицы в правильном DGV, переключив BS.DataMember, когда я ввел каждую вкладку. Это сработало, потому что у меня только один DGV за вкладку.

Где я столкнулся с проблемами, возвращался в базу данных. Я обнаружил, что большинство примеров, которые я нашел, связаны с использованием BS и ODA для каждой таблицы. Это кажется неэлегантным, поэтому, если бы был способ связать DataSource DGV с конкретным BS.Datamember, я бы с удовольствием это узнал.

Согласившись на несколько BS и ODA, я могу вытащить DGV, имя таблицы и BS, необходимые для обновления любых грязных строк на любом из DGV из одного Sub. Я не понял, есть ли способ получить ОПР, которая была использована для первоначального заполнения таблицы. В Коде:

Private Sub UniversalDGV_Handler_LeaveRow(sender As Object, e As DataGridViewCellEventArgs) _ 
     Handles DGV1.RowLeave, DGV2.RowLeave, '...' DGVn.RowLeave 

    Dim DGV As DataGridView = CType(sender, DataGridView) 
    Dim bsPass As BindingSource = DGV.DataSource 
    Dim CurrentDBTableName As String = bsPass.DataMember 
    Dim da as OleDbDataAdapter = 'something I haven't figured out yet 
    UniversalDGV_RowLeave(sender, CurrentDBTableName, e, bsPass, da) 

End Sub 

Теперь в действительности, наибольшее количество DGV у меня есть 7, так что я только что сделал согласованный список и вытащил ОПР из этого пути. Но снова это кажется очень грубым.

Есть ли способ, чтобы получить который DataAdapter был использован из-за стола он наполненной, DataSet он был использован на [БС, или DGV]?

Информация от BS или DGV кажется довольно далекой из-за того, что у меня нет прямого взаимодействия с ODA из моего понимания. Я также думал о возможности хранения информации в наборе данных, поскольку я использовал адаптеры, которые, по крайней мере, были бы более элегантным списком/таблицей.

ответ

0

Я нашел ответ, тщательно пройдя properties of the DataTable Class.

С помощью DataTable.ExtendedProperties() вы можете хранить DataAdapter, используемый при заполнении таблицы. Пример кода:

Dim ds as DataSet 
    Dim BS1 as New BindingSource 
    Dim da1, da2, da3 as New OleDbDataAdapter 
    Private Sub DoSomething(da as OleDbDataAdapter) 
     ds.Tables.Add(New DataTable(DBTableName)) 
     ds.Tables(DBTableName).ExtendedProperties("DataAdapter", da) 

    End Sub 
    Private Sub DoesSomethingElse() handles DGV1.Rowleave, DGV2.RowLeave, '...' DGVn.RowLeave 
    Dim DGV As DataGridView = CType(sender, DataGridView) 
    Dim bsPass As BindingSource = DGV.DataSource 
    Dim CurrentDBTableName As String = bsPass.DataMember 
    Dim RecalledDA as OleDbDataAdapter = ds.Tables(CurrentDBTableName).ExtendedProperties("DataAdapter") 
     'Do something with it. In my case I have a seperate sub I run it all into' 
    UniversalDGV_RowLeave(sender, CurrentDBTableName, e, da) 
    End Sub 

Поскольку у меня нет никакого формального обучения, может быть, все остальные знали, что, но я надеюсь, что смогу спасти кого-то все часы, чтобы понять это.

С помощью этого вы можете использовать одну BS для всех своих DGV, предполагая, что вы показываете только один за раз. Я думаю, вам все равно понадобится одна BS на DGV, если вы показываете несколько DGV, для которых требуется BS.

+0

@GordThompson Извините, что не дал вам знать прошлой ночью, но я понял, как его решить в целом здесь. [Ваш пример] (https://stackoverflow.com/questions/19369617/ds-tables-rows-add-makes-3-rows-when-called-once?answertab=active#tab-top) отлично справился с одним DGV , это была моя работа по расширению ее до нескольких. –

Смежные вопросы