2016-05-06 2 views
0

Я осмотрелся и не могу найти то, что мне нужно.Связать combobox с родительским DataRelation и обновить, когда изменения 2-го родителя

У меня есть БД с (другие другие) 3 таблицы.
SchemeType
Scheme
Type

SchemeType содержит внешние ключи первичных ключей как Scheme и Type

У меня есть .NET 3.5 WinForm, содержащую 2 выпадающие списки.
Один отображает Schemes
Я хотел бы другие, чтобы отобразить отчетливые Types, которые существуют в таблице SchemeType для этого выбранного Scheme.

У меня есть DataSet, который содержит все записи для всех трех таблиц и настроил DataRelations для отношений первичного и внешнего ключей.

Я использую BindingSources для заполнения comboboxes, но не могу решить, как получить комбобокс Type, чтобы обновить его содержимое, когда я изменяю поле со списком Scheme.

Я могу сделать это с прямым отношением родитель-ребенок, но не может решить, как закодировать отношение родительский-дочерний-родительский.
Вот мой код, с ненужными вещи раздели

Dim DS As New DataSet("myDS") 
    Dim SchemeBndSrc As New BindingSource 
    Dim TypeBndSrc As New BindingSource 

    Using cmd As New SqlCommand("myStroedProc", _conn) 
     cmd.CommandType = CommandType.StoredProcedure 
     Using adp As New SqlDataAdapter(cmd) 
      adp.Fill(DS) 
     End Using 
    End Using 

    ' Name the tables 
    DS.Tables(0).TableName = "Scheme" 
    DS.Tables(1).TableName = "Type" 
    DS.Tables(2).TableName = "SchemeType" 

    Dim rel As New DataRelation("Scheme-SchemeType", _ 
           DS.Tables("Scheme").Columns("SchemeID"), _ 
           DS.Tables("SchemeType").Columns("SchemeID"), _ 
           True) 

    Dim rel2 As New DataRelation("Type-SchemeType", _ 
           DS.Tables("Type").Columns("TypeID"), _ 
           DS.Tables("SchemeType").Columns("TypeID"), _ 
           True) 

    DS.Relations.Add(rel) 
    DS.Relations.Add(rel2) 



    ' Scheme 
    ' Set up the binding source 
    SchemeBndSrc.DataSource = DS 
    SchemeBndSrc.DataMember = "Scheme" 

    ' Bind the bindingsource to the combobox 
    cboScheme.ValueMember = "SchemeId" 
    cboScheme.DisplayMember = "SchemeName" 
    cboScheme.DataSource = SchemeBndSrc 
    cboScheme.SelectedIndex = -1 

    ' Type 
    ' Set up the binding source 
    TypeBndSrc.DataSource = SchemeBndSrc 
    TypeBndSrc.DataMember = "Type-SchemeType" 

    ' Bind the bindingsource to the combobox 
    cboType.ValueMember = "TypeID" 
    cboType.DisplayMember = "TypeDesc" 
    cboType.DataSource = TypeBndSrc 
    cboType.SelectedIndex = -1 

Тип выпадающий не содержит каких-либо предметов, несмотря на то, должно быть, по меньшей мере, один элемент в нем. Если я поменяю DataRelation вокруг, он не добавит его в DataSet, поскольку родительский в этом случае (SchemeType) не имеет уникальных записей для TypeID.

Может ли кто-нибудь помочь мне, пожалуйста?

ответ

0

Вы не сможете выполнить это автоматически с помощью привязки данных. Связывание данных может обрабатывать фильтрацию дочернего списка на основе выбранного родителя, поэтому вы можете получить список SchemeType для автоматического фильтра, основанного на выбранном Scheme. То, что вы тогда хотите, - это получить все родительские записи Type на основе этих дочерних записей, которые не привязаны к данным. Это должно быть ручным.

Свяжите ваши Scheme и SchemeType таблицы BindingSource с как родителем и ребенок, как обычно, с ребенком BindingSource привязанных к DataRelation через родитель BindingSource. Как только выбирается Scheme, и ребенок BindingSource фильтрует автоматически, вы можете его пропустить, чтобы получить все ID для записей Type и использовать его для построения значения Filter для третьего BindingSource, например.

Dim typeIDs = schemeTypeBindingSource.Cast(Of DataRowView)(). 
             Select(Function(drv) CInt(drv("TypeID"))) 

typeBindingSource.Filter = String.Fomrat("TypeID IN ({0})", 
             String.Join(", ", typeIDs)) 
+0

А, спасибо. Я боялся, что это будет ручная работа, но мне хотелось проверить, нет ли автоматического способа, которым я отсутствовал. Я прав, что я не смогу также привязать выбранные значения каждой комбо, чтобы иметь возможность использовать процесс SQLDataAdapter.Update? –

+0

Я не уверен на 100%, что последствия будут без тестирования. Я не уверен, что вы можете использовать привязку к фильму и обновлению. – jmcilhinney

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

  • Нет связанных вопросов^_^