Relace v DataSetu a nastaveni ComboBoxu   otázka

SQL

Dobry den,

mam problem s relacemi, respektive s jejich naslednym zobrazenim.

Mam v SQL dve tabulky:

1. PROVOZ - PROVOZ_ID, PROVOZ_POZNAMKA

2. STAVBA - STAVBA_ID, PROVOZ_ID, STAVBA_POZNAMKA

Jsou v relaci 1:N pres PROVOZ_ID.

Programove to resim takto:

Private SqlDA_PROVOZ As SqlDataAdapter      ' DataAdapter pro tabulku PROVOZ
    Private SqlDA_STAVBA As SqlDataAdapter      ' DataAdapter pro tabulku STAVBA

 Private DS_Pridat As DataSet                ' DataSet pro tento formular

'1. pridani SqlDA_PROVOZ
        SqlDA_PROVOZ = New SqlDataAdapter
        SqlDA_PROVOZ.TableMappings.Add("PROVOZ", "PROVOZ")
        cmd = New SqlCommand("SELECT * FROM PROVOZ", SqlConnection)
        SqlDA_PROVOZ.SelectCommand = cmd

        '2. pridani SqlDA_STAVBA
        SqlDA_STAVBA = New SqlDataAdapter
        SqlDA_STAVBA.TableMappings.Add("STAVBA", "STAVBA")
        cmd = New SqlCommand("SELECT * FROM STAVBA", SqlConnection)
        SqlDA_STAVBA.SelectCommand = cmd

SqlDA_PROVOZ.Fill(DS_Pridat, "PROVOZ")
        SqlDA_STAVBA.Fill(DS_Pridat, "STAVBA")

' PRIDANI RELACI MEZI TABULKAMI
        Dim relation As DataRelation
        Dim dataColumn1, dataColumn2 As DataColumn

        '1. relace mezi PROVOZ -> STAVBA
        dataColumn1 = DS_Pridat.Tables("PROVOZ").Columns("PROVOZ_ID")
        dataColumn2 = DS_Pridat.Tables("STAVBA").Columns("PROVOZ_ID")
        relation = New DataRelation("PROVOZ_with_STAVBA", dataColumn1, dataColumn2)
        DS_Pridat.Relations.Add(relation)

zavedl jsem onu relaci a ocekaval, ze po nastaveni ComboBox, ktery zobrazuje vsechny PROVOZY se mi po vybrani jednoho provozu do dalsiho ComboBoxu vypisi pouze STAVBY, ktere budou v relaci s provozy:

With Me
 ' Nastaveni filtru u pridani zarizeni
            .CB_FiltrProvoz.DataSource = DS_Pridat
            .CB_FiltrProvoz.DisplayMember = "PROVOZ.PROVOZ_ID"
            .CB_FiltrProvoz.DataBindings.Add("Tag", DS_Pridat, "PROVOZ.PROVOZ_ID")
            .CB_FiltrProvoz.ValueMember = "PROVOZ.PROVOZ_ID"

            .CB_FiltrStavba.DataSource = DS_Pridat
            .CB_FiltrStavba.DisplayMember = "STAVBA.STAVBA_ID"
            .CB_FiltrStavba.DataBindings.Add("Tag", DS_Pridat, "STAVBA.STAVBA_ID")
            .CB_FiltrStavba.ValueMember = "STAVBA.PROVOZ_ID"
            .CB_FiltrStavba.SelectedValue = "PROVOZ.PROVOZ_ID"
End With

Ale to bohuzel nejde, nebo spis mam problem s tim, jak spravne ty dva ComboBoxy nastavit.

Zkusil jsem jeste pridat proceduru:

    Private Sub CB_FiltrProvoz_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB_FiltrProvoz.SelectedIndexChanged


' a zde jsem se pokousel nastavovat jak Selected Value, tak i neco jineho, ale naprosto bez uspechu.
    End Sub

Jeste nutno poznamenat, ze PROVOZ_ID a STAVBA_ID jsou typu TEXT a jsou jednoznacne urceny, takze slouzi jako primarni klice.

Napadlo me to udelat pres SelectCommand s tim, ze v nem nebudu vybirat vsechny polozky, ale pouze takove, kde se budou rovnat provoz_id, ale zajimalo by me, zda to nejde nejak rychleji :-)

Dekuju moc :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Podobný probém jsem řešil a funguje mně pro spojení dvou prvků typu Master->Detail konstrukce, která spočívá ve vytvoření objektů BindingSource. Podřízenému objektu přiřadím v konstruktoru parametr dříve definované relace a pak takto vzniklý objekt použiju jako datový zdroj pro zobrazovací prvek.

V následujícím příkladu provazuji dvě datové mřížky (pro Combo Boxy to bude obdobné, jen bude třeba přidat konkrétní DisplayMember a ValueMember) kde Master odpovídá Akci (u Vás Provoz) a Detail Seznamu (u Vás Stavba)

re12 = New DataRelation("AkceSeznam", dtAkce.Columns("AKC_ID"), dtSeznam.Columns("AKC_ID"))
dsDostihy.Relations.Add(re12)
bsAkce = New BindingSource(dsDostihy, "Akce")                   dgwAkce.DataSource = bsAkce                                     bsSeznam = New BindingSource(bsAkce, "AkceSeznam")              dgwSeznam.DataSource = bsSeznam                             

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ono prave s nastavenim ValueMember mam trochu problem... stale si neumim predstavit, co presne to znamena, a jak mam druhemu ComboBoxu rict, ze ma vybirat podle ValueMember toho prvniho ComboBoxu.

Kdyby alespon funkce SelectedChanged nebo pripadne SelectedIndexChanged fungovala tak, jak jsem si prestoval. Kdyz ji pouziji, tak mi vzdy vyhodi hodnotu toho predchoziho prvku. Respektive:

- provedu zmenu vyberu ze Stavba 1 na Stavba 2

- ocekavam v ComboBox.Tag hodnotu Stavba 2, ale mam tam Stavba 1

- az kdyz zmenim ze Stavba 2 na Stavba 3, dostanu hodnotu Stavba2...

A vubec, obecne kdyz uz jsem u toho, je takoveto rucni nastavovani objektu dobry nebo sptany napad?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback