| |
ADO.NET / DatenbankenAdo.net Relation und Bindung an Steuerelemente bei n:1 Beziehung | | | Autor: Schoofi | Datum: 09.09.15 13:50 |
| Hallo,
ich bin dabei von VB6 auf VB.net umzustellen.
Bei meinen Formularen setze ich gern Comboboxen ein, aus denen Schlüsselwerte ausgewählt werden können.
Dies wollte ich über das Relation Objekt realisieren.
Den umgekehrten Weg, wähle in der Mastertabelle und lasse eine Liste in der Detailtabelle anzeigen habe ich im Internet gefunden.
Nur wie muß ich in meinem Fall, die Bindungen setzen ?
Bsp. Es gibt viele Rechner, von denen ich einen auswähle und dazu soll in der Combobbox das Betriebssytem angezeigt werden.
Bisher bin ich soweit gekommen, das ich alle Rechner eines Betriebssytems anzeigen lassen kann, ich will aber den Rechner wählen und dazu das BS einblenden.
anbei der Quellcode:
Public Class frm_Rechner
Dim ping As New System.Net.NetworkInformation.Ping
Dim lngPingReply As System.Net.NetworkInformation.PingReply
Dim lngPing As Long
Dim dsRechner As New DataSet
Dim drBS As DataRelation
Dim dtBS As DataTable
Dim dtRechner As DataTable
Dim bsbs As New BindingSource
Dim bsRechner As New BindingSource
Protected Overrides Sub onload(e As EventArgs)
'Dim dtBS As DataTable
dsRechner.Locale = System.Globalization.CultureInfo.InvariantCulture
comRechnerliste.CommandText = "SELECT * FROM tbl_Rechner ORDER BY Rechner"
Try
daRechnerliste.Fill(dsRechner, "Rechner")
Catch ex As Exception
MessageBox.Show("Das Füllen der Tabelle Rechner ist gescheitert" & vbCrLf _
& ex.Message)
Exit Sub
End Try
comRechnerliste.CommandText = "SELECT * FROM tbl_Z_Betriebssystem"
Try
daRechnerliste.Fill(dsRechner, "Betriebssystem")
Catch ex As Exception
MessageBox.Show("Das Füllen der Tabelle Betriebssystem ist gescheitert" & _
vbCrLf & ex.Message)
Exit Sub
End Try
dtBS = dsRechner.Tables("Betriebssystem")
dtRechner = dsRechner.Tables("Rechner")
Try
Dim Relation As New DataRelation("RechnerBS", dtBS.Columns( _
"ID_Betriebssystem"), dtRechner.Columns("ID_Betriebssystem"))
dsRechner.Relations.Add(Relation)
Catch ex As Exception
MessageBox.Show("Die Beziehung zwischen Rechner und Betriebssytem konnte" & _
"nicht hergestellt werden" & vbCrLf & ex.Message)
Exit Sub
End Try
With bsbs
.DataSource = dsRechner
.DataMember = "Betriebssystem"
End With
With bsRechner
.DataSource = bsbs
.DataMember = "RechnerBS"
End With
Me.txtBetriebssystem.DataBindings.Add("Text", bsbs, "Betriebssystem")
Me.txtBetriebssystem.Text = "Windows 7"
Try
With Me.autID_Rechner
.DisplayMember = "ID_Rechner"
.ValueMember = "ID_Rechner"
.DataSource = bsRechner
End With
Me.txtBemerkungen.DataBindings.Add("Text", bsRechner, "Bemerkungen")
Me.txtClient.DataBindings.Add("Text", bsRechner, "Rechner")
Me.txtSeriennr.DataBindings.Add("Text", bsRechner, "RechnerSeriennr")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
end sub Andreas Schoof | |
Re: Ado.net Relation und Bindung an Steuerelemente bei n:1 Beziehung | | | Autor: Manfred X | Datum: 09.09.15 14:51 |
| Hallo!
Ich vermute, Du mußt den aktuellen Combobox-Wert aus der dort angebundenen
Detail-Tabelle (Computerliste) nutzen, um die Einträge in der Master-Tabelle
(System-Liste) per Bindingsource zu filtern.
Ob die Verbindung so herum über eine Datarelation auch direkt funktioniert,
weiß ich nicht. (Per "GetParentRow" der "ChildRow" kann jeweils die übergeordnete
Zeile - gemäß der DataRelation - abgerufen werden.)
Beitrag wurde zuletzt am 09.09.15 um 15:12:47 editiert. | |
Ergänzender Hinweis | | | Autor: Manfred X | Datum: 09.09.15 16:56 |
| Du kannst Deine Computerliste als Master-Table verwenden und die System-Liste
als Child-Table. In der Master-Spalte der Datarelation wird die Spalte mit dem
SystemID verwendet, als Child-Spalte die ID der SystemListe.
Die Datenbindung der Controls ist wie bei Master-Child-Beziehungen üblich einzurichten
(Bindung an entsprechende Bindingsource).
Allerdings darf dann keine weitere (umgekehrte Hierarchie) Datarelation zwischen
diesen Tabellen im Dataset definiert sein, sonst droht Datenverlust.
| |
Beispiel für Master-Detail | | | Autor: Manfred X | Datum: 10.09.15 11:56 |
| Im Prinzip sollte die Master(Computer)-Detail(System)-Beziehung funktionieren.
Der CreateConstraints-Parameter der Relation muß auf "false" gesetzt werden.
Public Class frmComboRelation
Dim ds As New DataSet
Dim dtmaster As New DataTable
Dim dtDetail As New DataTable
Dim dtm, dtd As DataTable
Dim bsMaster As New BindingSource
Dim bsDetail As New BindingSource
Dim cbo As New ComboBox With {.Parent = Me}
Dim dgvDetail As New DataGridView With _
{.Parent = Me, .AllowUserToAddRows = False, _
.Top = 50, .Width = 300, .Height = 400}
Private Sub frmComboRelation_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'Computer-Tabelle
With dtmaster.Columns
.Add("ID", GetType(Integer))
.Add("Computer")
.Add("SystemID", GetType(Integer))
End With
With dtmaster.Rows
.Add(1, "A (Dos)", 2)
.Add(2, "B (Dos)", 2)
.Add(3, "C (Unix)", 3)
.Add(4, "D (Linux)", 1)
.Add(5, "E (Linux)", 1)
.Add(6, "F (----)", -1)
End With
dtmaster.PrimaryKey = {dtmaster.Columns(0)}
dtmaster.TableName = "Computer"
'Tabelle der Betriebssysteme
dtDetail.Columns.Add("ID", GetType(Integer))
dtDetail.Columns.Add("System")
With dtDetail.Rows
.Add(1, "Linux")
.Add(2, "Dos")
.Add(3, "Unix")
.Add(4, "Windows")
End With
dtDetail.PrimaryKey = {dtDetail.Columns(0)}
dtDetail.TableName = "Systeme"
'Dataset mit Tabellen
ds.Tables.AddRange({dtmaster, dtDetail})
'Relation
ds.Relations.Add(New DataRelation("ComputerSystem", _
dtmaster.Columns("SystemID"), dtDetail.Columns("ID"), False))
'Bindingsourcen für Master-Detail-Beziehung belegen
bsMaster.DataMember = dtmaster.TableName
bsMaster.DataSource = ds
bsDetail.DataMember = "ComputerSystem"
bsDetail.DataSource = bsMaster
'Datenbindungen
cbo.ValueMember = dtmaster.Columns("Computer").ColumnName
cbo.DataSource = bsMaster
dgvDetail.DataSource = bsDetail
End Sub
End Class
Beitrag wurde zuletzt am 10.09.15 um 12:16:12 editiert. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|