none
DBLookup Combofield, wie mache ich das? RRS feed

  • Frage

  • Hallo zusammen,

    Ich versuche schon seit langen verzweifelt ein DBLookup Combofeld zu erstellen, welches ich aus Delphi her kenne.

    Seine Funktion ist schnell erzählt. Im Prinzip das selbe wie eine Combobox mit Datenbindung.

    Folgendende Situtation:

    Zwei Tabellen:

    Tabelle1: Talente mit verschiedenen Daten, vor allem mehrere Felder für verschiedene Eigenschaften (sind immer 5).

    Tabelle2: Die Eigenschaften

    Nun soll eine Combobox die Eigenschaften aus der Eigenschaftstabelle anzeigen. Wenn ein Wert geändert wird, in der Tabelle Talente unter Eigenschaft1...Eigenschaft5 die ID speichern.

    Dies klappt wunderbar, wenn es nur eine Eigenschaft ist. Sobald ich jedoch mehr als nur eine Abfrage mache, bekomme ich trotz unterschiedlicher ID´s in der Talenttabelle alle werte gleich angezeigt.

    Ich weiß leider nicht, wo mein fehler liegt, ob es an der nicht vorhandenen Beziehung liegt oder an was auch immer?

    Bitte helft.

    Mittwoch, 1. März 2006 15:47

Alle Antworten

  • Hi,

    vielleicht hilft di folgender code weiter:

     

        Private ds As New dataset

        Private Sub Form1_Load(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles MyBase.Load

            Dim da As New SqlDataAdapter _
                ("Select * from tabelle", con)
            da.Fill(dt)
            ComboBox1.DataSource = dt
            ComboBox1.DisplayMember = "TalenteName"
            ComboBox1.ValueMember = "TalenteWert"
     Dim dr As DataRowView = CType(ComboBox1.SelectedItem, _
              DataRowView)

    'Hier dein erweiterter Code
          MessageBox.Show(dr("TalentWert").ToString)


        End Sub
    End Class

     

    Beim select Befehl kannst du die Tabellen zusammenführen.

    Bei weiteren Fragen poste einfach Deinen Code, dann helfen wir dir weiter.

    Viele Grüße

    Alex

    Montag, 6. März 2006 18:54
  • Das kann leider nicht funktionieren, da ich nicht mit einen Server arbeite, sondern einzig und allein mit einen Typisierten Dataset.

    Gruß Marco

    Montag, 6. März 2006 18:58
  • Hallo Marco,

    die Daten müssen doch auch irgendwie in das typisierte DataSet kommen, oder?

    Du kannst aber auch ein DataSet für die Datenbindung der ComboBox benutzen:

    Dim ds As New DataSet

    Me.ComboBox1.DataSource = ds

     

    Falls dieses nicht klappt bitte Code posten, dann haben wir hier den schnelleren Überblick, danke

    Viele Grüße

    Alex

    www.vb-magazin.de

    Montag, 6. März 2006 19:47
  • Also das hier ist meine bisherige Bindungsversuche:

     Was passiert? Es wird bei allen Comboboxen der Wert EW1 angezeigt

    Was passieren soll?

    Die ComboBox soll so wie eine DBLookupCombobox aus Delphi funktionieren. Aus der Tabelle "Eigenschaften" sollen alle "Langbeschreibungen" angezeigt werden. Der ausgewählte Wert soll in "Talent_Koerper.EW1".."Talent_Koerper.EW3" abgespeichert werden, um genau zu sein, der Schlüsselwert ID der Langbeschreibung. Ebenfalls soll die Combobox natürlich dann im Textfeld die Langbeschreibung der ID aus Eigenschaften holen, von der ID die in "Talent_Koerper.EW1" abgespeichert wurde.

    Ich nutze ein Typisiertes Dataset welches ich über den Desinger erstellt habe. Dieses Dataset heißt "Stammdaten" und beinhaltet natürlich weitere Tabellen auser die Beiden.

    With Me.IDTextBox

    .DataBindings.Add("Text", Talent_KoerperBindingSource, "ID")

    End With

    With Me.TabelleTextBox

    .DataBindings.Add("Text", Talent_KoerperBindingSource, "Tabelle")

    End With

    With Me.BezeichnungTextBox

    .DataBindings.Add("Text", Talent_KoerperBindingSource, "Bezeichnung")

    End With

    With Me.EW1ComboBox

    .DataSource = Stammdaten.Eigenschaften ' Enspricht der Tabelle, woher die Auswahl kommen soll

    .DisplayMember = "Langbeschreibung" 'Entspricht des Anzeigefeldes

    .ValueMember = "ID" 'Enspricht dem Wert der Abgespeichert wird

    .DataBindings.Add("SelectedValue", Talent_KoerperBindingSource, "EW1") 'legt fest, woher/wohin der .ValueMember (das KeyField) kommt

    End With

    With Me.EW2ComboBox

    .DataSource = Stammdaten.Eigenschaften ' Enspricht der Tabelle, woher die Auswahl kommen soll

    .DisplayMember = "Langbeschreibung" 'Entspricht des Anzeigefeldes

    .ValueMember = "ID" 'Enspricht dem Wert der Abgespeichert wird

    .DataBindings.Add("SelectedValue", Talent_KoerperBindingSource, "EW2") 'legt fest, woher/wohin der .ValueMember (das KeyField) kommt

    End With

    With Me.EW3ComboBox

    .DataSource = Stammdaten.Eigenschaften ' Enspricht der Tabelle, woher die Auswahl kommen soll

    .DisplayMember = "Langbeschreibung" 'Entspricht des Anzeigefeldes

    .ValueMember = "ID" 'Enspricht dem Wert der Abgespeichert wird

    .DataBindings.Add("SelectedValue", Talent_KoerperBindingSource, "EW3") 'legt fest, woher/wohin der .ValueMember (das KeyField) kommt

    End With

    With Me.Navigator

    .BindingSource = Talent_KoerperBindingSource

    End With

    Mittwoch, 8. März 2006 22:03
  • Okay,

    die Zeile zurückschreiben kannst du z.B.: mit einem DataRow-Objekt.

    Folgendes Beispiel zeigt, wie du neue Daten in die Datenbank über dein DataSet zurüschreiben kannst:

    Dim dr As DataRow

    dr = Me.DeinDS.NameDerTabelle.NewRow

    dr.Item("E1") = CInt(combobox.SelectedValue)

    dr.Item("E1") = CInt(combobox2.SelectedValue)

    Me.DeinDS.Zeiten.NameDerTabelle.Add(dr)

    Me.DeinAutomatischgenerierterTableAdapter.Update(Me.DeinDS.Zeiten.NameDerTabelle)

    MessageBox.Show("Daten erfolgreich eingefügt")

    Donnerstag, 9. März 2006 12:26
  • Das Problem liegt NICHT beim zurückschreiben, sondern bei der Anzeige. Wenn ich den von mir o.g. Code nutze erhalte ich nur die Anzeige von

    1. den ersten EW wert in allen Combos

    2. Die Auflistung ausschließlich als ID

    Des weiteren kann ich kein update über ein TableAdapter machen, weil ich den gar nicht besitze. Ich hole meine Daten nicht aus einer Datenbank sondern aus einer XML File. Was bei kleiner Datenmenge meiner Meinung nach sinnvoller ist. Ich dachte das bedeutet dann typisiertes Dataset?

    PS: Ob mit oder ohne Constraints (Sind doch realtionen oder?), funktioniert die anzeige nie

    Donnerstag, 9. März 2006 15:19
  • Bei einem typisierten ist die Datenquelle egal. Constraints dienen zur Wahrung der Integrität (jede ID darf nur einmal vorhanden sein), Relationen ist die Beziehung der Tabelle untereinander. Xml ist nicht umbedingt sinnvoller für kleine Datenbestände, da es meiner Meinung nach wesentlich komplizierter ist die Daten zurückzuschreiben. Hast du die möglichkeit das Projekt mal an

    alex [at] vb-magazin.de zusenden? Dann gucke ich mir das ganze mal an. Ansonsten:

    Versuch mal das ganze Projekt auf Basis von Access oder dem SQL Server 2005 Express aufzubauen, der Datenimportassistent erleichtert dir den Import von Daten.

    Viele Grüße

    Alex

    Donnerstag, 9. März 2006 15:27