| |
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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|