Linq - Group Join - Synatax Probleme
- VB.NET
- .NET (FX) 4.5–4.8
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 160 Antworten in diesem Thema. Der letzte Beitrag () ist von StGo.
-
-
StGo schrieb:
Wo mein Fehler liegt und was ihn auslöst habe ich in Post 104, 107, 110, 112 beschrieben.
Nein, hast du nicht. Du hast nicht geschrieben, die Zeile löst die und die Fehlermeldung/Exception aus. Du hast ein Screenshot gepostet, der zeigt, dass du am Methodenkopf stehen bleibst (im Haltepunkt), mehr Infos habe ich nicht gefunden. Denn DANACH wurdest du gefragt, warum du nicht auf .Current Is Nothing prüfst und du sagtest nur, dass das nicht geht. Ohne den Code zu posten, mit dem du das ausprobiert hast (nur den falschen auskommentierten Code, der syntaktisch nicht geht). -
stürtzt bei mir nicht ab.
VB.NET-Quellcode
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- 'Zentriert starten
- Dim Bildschirm As Screen = Screen.PrimaryScreen
- Location = New Point(Bildschirm.Bounds.Left + (Bildschirm.Bounds.Width - Width) \ 2, Bildschirm.Bounds.Top)
- 'Reiter verstecken
- 'TabControl1.Alignment = TabAlignment.Bottom
- TabControl1.SizeMode = TabSizeMode.Fixed
- TabControl1.ItemSize = New Size(0, 1)
- TabControl1.Appearance = TabAppearance.Buttons
- TabControl1.ResumeLayout()
- 'TabControl2.Alignment = TabAlignment.Bottom
- TabControl2.SizeMode = TabSizeMode.Fixed
- TabControl2.ItemSize = New Size(0, 1)
- TabControl2.Appearance = TabAppearance.Buttons
- TabControl2.ResumeLayout()
- 'Daten generieren
- datenGenerieren()
- End Sub
Kommentier mal bitte Zeile 20 aus. Jetzt werden jedes mal neue Datengeneriert. Wenn ich aber welche aus dem xml File laden will taucht das Problem auf. "Datei -> laden aus xml"
-
-
-
Also beim mir erzeugt die Variante einen Fehler beim Start:
VB.NET-Quellcode
- Option Strict On
- Imports System.IO
- Public Class frmMasterDetail
- Private _Datafile As New FileInfo("Dataset_Stammdaten.xml")
- Private Sub MenuStrip1_MenuClicked(ByVal Sender As Object, ByVal e As EventArgs) Handles DatenGenerierenToolStripMenuItem.Click, SaveToXMLToolStripMenuItem.Click, LadenAusXMLToolStripMenuItem.Click
- Select Case True
- Case Sender Is DatenGenerierenToolStripMenuItem
- datenGenerieren()
- Case Sender Is SaveToXMLToolStripMenuItem
- speicherToXml()
- Case Sender Is LadenAusXMLToolStripMenuItem
- ladenVonXml()
- End Select
- End Sub
- Private Sub datenGenerieren()
- 'Daten generieren
- Dim AnzahlZuGenerierendenDatensaetze As Integer = 19
- Dim tmp As Integer
- Dim tmpXls As Integer
- Dim tmpPdf As Integer
- Dim tmpDateityp As String
- Dim Cell As String
- Dim Bereich As String
- Dim rnd As New Random
- DsStammdaten.Clear()
- 'Tabelle Stammdaten generieren
- For i = 0 To AnzahlZuGenerierendenDatensaetze
- tmp = rnd.Next(1, 3)
- Select Case tmp
- Case 1
- tmpDateityp = "xls"
- Case 2
- tmpDateityp = "pdf"
- Case Else
- tmpDateityp = "error"
- End Select
- DsStammdaten.Stammdaten.AddStammdatenRow(i, "C:\Eingabepfad\hier liegt mein Dokument" & i, "C:\Ausgabepfad\hier wird es abgelegt" & i, tmpDateityp)
- Next
- 'Tabelle XLS generieren
- For j = 0 To AnzahlZuGenerierendenDatensaetze
- If DsStammdaten.Stammdaten.Rows(j).Item(4).ToString = "xls" Then
- tmpXls = rnd.Next(1, 5)
- Select Case tmpXls
- Case 1
- Cell = "A"
- Case 2
- Cell = "B"
- Case 3
- Cell = "C"
- Case 4
- Cell = "D"
- Case Else
- Cell = "error"
- End Select
- Dim tmpIdStammdaten = DsStammdaten.Stammdaten(j)
- DsStammdaten.XLS.AddXLSRow(tmpIdStammdaten, CStr(j), Cell & j)
- End If
- Next
- 'Tabelle PDF generieren
- For k = 0 To AnzahlZuGenerierendenDatensaetze
- If DsStammdaten.Stammdaten.Rows(k).Item(4).ToString = "pdf" Then
- tmpPdf = rnd.Next(1, 4)
- Select Case tmpPdf
- Case 1
- Bereich = "X"
- Case 2
- Bereich = "Y"
- Case 3
- Bereich = "Z"
- Case Else
- Bereich = "error"
- End Select
- Dim tmpIdStammdaten = DsStammdaten.Stammdaten(k)
- DsStammdaten.PDF.AddPDFRow(tmpIdStammdaten, "Der Text wird im Bereich: " & Bereich & k & " gesucht.")
- End If
- Next
- End Sub
- Private Sub speicherToXml()
- Me.Validate()
- DsStammdaten.WriteXml(_Datafile.FullName)
- MessageBox.Show("Daten erfolgreich gespeichert (siehe Projektverzeichnis\bin\Debug)")
- End Sub
- Private Sub ladenVonXml()
- DsStammdaten.Clear()
- If _Datafile.Exists Then
- DsStammdaten.ReadXml(_Datafile.FullName)
- MessageBox.Show("Daten erfolgreich geladen")
- Else
- MessageBox.Show("Keine Daten vorhanden")
- End If
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- 'Zentriert starten
- Dim Bildschirm As Screen = Screen.PrimaryScreen
- Location = New Point(Bildschirm.Bounds.Left + (Bildschirm.Bounds.Width - Width) \ 2, Bildschirm.Bounds.Top)
- 'Reiter verstecken
- 'TabControl1.Alignment = TabAlignment.Bottom
- TabControl1.SizeMode = TabSizeMode.Fixed
- TabControl1.ItemSize = New Size(0, 1)
- TabControl1.Appearance = TabAppearance.Buttons
- TabControl1.ResumeLayout()
- 'TabControl2.Alignment = TabAlignment.Bottom
- TabControl2.SizeMode = TabSizeMode.Fixed
- TabControl2.ItemSize = New Size(0, 1)
- TabControl2.Appearance = TabAppearance.Buttons
- TabControl2.ResumeLayout()
- 'Daten generieren
- 'datenGenerieren()
- End Sub
- Private Sub StammdatenBindingSource_CurrentChanged(sender As Object, e As EventArgs) Handles StammdatenBindingSource.CurrentChanged
- If StammdatenBindingSource.Current Is Nothing Then
- Return
- Else
- 'If StammdatenBindingSource.Current <> 0 Then
- Dim rwStamm = DirectCast(DirectCast(StammdatenBindingSource.Current, DataRowView).Row, dsStammdaten.StammdatenRow)
- 'If rwStamm.RowState <> DataRowState.Detached Then
- Select Case rwStamm.Dateityp
- Case "xls"
- TabControl1.SelectedIndex = 1
- TabControl2.SelectedIndex = 1
- Case "pdf"
- TabControl1.SelectedIndex = 2
- TabControl2.SelectedIndex = 2
- Case Else
- TabControl1.SelectedIndex = 0
- TabControl2.SelectedIndex = 0
- End Select
- End If
- End Sub
- Private Sub StammdatenDataGridView_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles StammdatenDataGridView.EditingControlShowing
- Dim myButton As New Button
- With myButton
- .Dock = DockStyle.Right
- .Name = "btnOpen"
- .Text = "..."
- .Width = 25
- End With
- If Not StammdatenDataGridView.Controls.ContainsKey(myButton.Name) Then
- StammdatenDataGridView.EditingPanel.Controls.Add(myButton)
- End If
- myButton.BringToFront()
- End Sub
- Private Sub cmdXlsLoeschen_Click(sender As Object, e As EventArgs) Handles cmdXlsLoeschen.Click
- End Sub
- Private Sub cmdPdfLoeschen_Click(sender As Object, e As EventArgs) Handles cmdPdfLoeschen.Click
- End Sub
- Private Sub cmdXlsSpeichern_Click(sender As Object, e As EventArgs) Handles cmdXlsSpeichern.Click
- End Sub
- Private Sub cmdPdfSpeichern_Click(sender As Object, e As EventArgs) Handles cmdPdfSpeichern.Click
- End Sub
- End Class
und zwar an dieser Stelle (Zeile 10) im dsStammdaten.Designer
VB.NET-Quellcode
- <Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
- Global.System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")> _
- Public Property Dateityp() As String
- Get
- Try
- Return CType(Me(Me.tableStammdaten.DateitypColumn), String)
- Catch e As Global.System.InvalidCastException
- Throw New Global.System.Data.StrongTypingException("Der Wert für Spalte Dateityp in Tabelle Stammdaten ist DBNull.", e)
- End Try
- End Get
- Set(value As String)
- Me(Me.tableStammdaten.DateitypColumn) = value
- End Set
- End Property
-
Du hast das DataSet zu dem Zeitpunkt noch gar nicht geladen und willst rwStamm.DateiTyp abfragen. Normalerweise lädt man am Anfang des Programms gleich das Dataset...
Du kannst einen Flag (eine boolsche Variable) "IsLoad" einfügen, welchen du nach dem DataSet befüllen (entweder per XML oder per Datengenerieren) auf True setzt. Diesen Flag fragst du am Anfang von .CurrentChanged ab und gehst raus, wenn er auf False steht. -
-
-
-
Guten Morgen,
@EDR
Das habe ich überlesen. Es funktioniert wie du es sagst. Entschuldige bitte. Habe ich wirklich nicht gesehen.
Für alle die mitlesen und den richtigen Code jetzt sehen wollen:
VB.NET-Quellcode
- Private Sub StammdatenBindingSource_CurrentChanged(sender As Object, e As EventArgs) Handles StammdatenBindingSource.CurrentChanged
- If StammdatenBindingSource.Current Is Nothing Then
- Return
- Else
- Dim rwStamm = DirectCast(DirectCast(StammdatenBindingSource.Current, DataRowView).Row, dsStammdaten.StammdatenRow)
- If rwStamm.RowState <> DataRowState.Detached Then
- Select Case rwStamm.Dateityp
- Case "xls"
- TabControl1.SelectedIndex = 1
- TabControl2.SelectedIndex = 1
- Case "pdf"
- TabControl1.SelectedIndex = 2
- TabControl2.SelectedIndex = 2
- Case Else
- TabControl1.SelectedIndex = 0
- TabControl2.SelectedIndex = 0
- End Select
- End If
- End If
- End Sub
-
-
Das bedeutet nicht unbedingt "leer", sondern es bedeutet: "in keiner DataTable" - mit der Auswirkung, das verknüpfte Datensätze nicht abrufbar sind, denn der Datensatz ist noch nicht verknüpft.
Daher der Fehler bei StGo, wenn er versucht, auf die ChildRows der Detachten Zeile zuzugreifen.
(Und solch Datensatz wird natürlich nicht mit abgespeichert.)
ja, irgendwann kann man sich mal mit den Rowstates befassen: ObjectBrowser gucken, welche es gibt, Testprojekt machen, und rumspielen mit- rw=MyDataTable.NewMyRow
- MyDataTable.Add(rw)
- rw.Delete
- rw.MyProperty=aValue
- MyDataTable.AcceptChanges
- MyDataTable.RejectChanges
- MyDataset.HasChanges / .GetChanges
Der Rowstate ist hauptsächlich das Kernstück der Änderungsverfolgung, und bleibt damit üblicherweise im Hintergrund, aber zB. die HinzufügeZeile einer BindingSource hat RowState.Detached.
Ja, und bei Rowstate.Detached existieren die DataRelations noch nicht, und bei Rowstate.Deleted sind gar keine Werte abrufbar.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()
- rw=MyDataTable.NewMyRow
-
Ja, ich habe eben bei MSDN schon nachgeschaut:
msdn.microsoft.com/de-de/libra…tarowstate(v=vs.110).aspx
Allerdings habe ich noch nie was mitTable.AcceptChanges
usw. gemacht. Wann brauche ich das? -
-
-
Ich muss euch nochmal etwas fragen. Wenn ich das Dataset typisiert erstellt habe und meine enthaltenen Tables in einem DGV anzeige und die Daten durch das DGV „verschmelze“ etspricht dies einem Join – oder?Konkret hier aus dem Beispiel Programm:Stammdaten sind über die Relation Id – IdStammdaten mit den Daten XLS verbunden. Im DGV Master/Detail View werden die Daten aus den einzelnen Tabellen entsprechend angezeigt. (Das DGV weiss auch, dass die Spalte Id aus den Stammdaten mit der Spalte IdStammdaten aus dem XLS Table zusammengehört.)
1. Wenn ich eine Zeile in den Stammdaten hinzufüge muss mir das DGV doch irgendwie eine passende Zeile im DetailView anbieten. Wie realisiere ich das?
2. Wenn ich kein DGV habe und Daten aus einem 2d Array in mein typisiertes Dataset laden möchte stehe ich vor dem Problem, dass ich die Parent/Child Beziehung berücksichtigen muss. Wie gehe ich das Problem an? (Mir ist klar das dieser Falle eher ein theoretischer ist da man das DGV normalerweise für dieses Problem einsetzt – sieh Frage 1)
Zu 2.
Stammdaten:
Id | Nr | Eingabepfad | Ausgabepfad | Dateityp
Autoincrement | Autoincrement | String | String | String
XLS:
Id | IdStammdaten | Blatt | Zeile
Autoincrement | Fremdschlüssel von Stammdaten | String | String
Im Falle einer unverkrüpften Tabelle würde ich beide Tabellen auf diese Weise füllen:
Das Problem was ich jetzt habe ist das ich keine Idee haben wie ich den zusammenhang der Tabellen gegenüber dem Compiler klar mache.
Danke -
StGo schrieb:
Das Problem was ich jetzt habe ist das ich keine Idee haben wie ich den zusammenhang der Tabellen gegenüber dem Compiler klar mache.
Ganz großes *SEUFZ*
Post #69, vor einer Woche:
Linq - Group Join - Synatax Probleme
Da habe ich dir EXAKT das geschrieben, was du jetzt schon wieder fragst. -
Da habe ich dir EXAKT das geschrieben, was du jetzt schon wieder fragst.
Ach ja? Ich würde sagen du hast auf dem Autoinkrement rumgehackt. Was im endefekt etwas undeutlich beschrieben war aber in der Syntax richtig.
Wie man hier sieht:
übergeb ich drei Strings wie es das Dataset verlangt. Aber dsa ist auch gar nicht die Frage!
Ein Datensatz ist auf zwei Tabellen "aufgeteilt". Also muss ich im Prinzip Eingabepfad | Ausgabepfad | Dateityp | Blatt | Zeile übergeben da die Id in den Stammdaten generiert wird und gleichzeitig Fremdschlüssel in der XLS Tabelle ist kann ich hier nichts übergeben. Genau da liegt dsa Problem! (Die Spalte Nr in den Stammdaten wird auch automatisch generiert.)
Die Frage ist also: Muss die Daten so (in einem Rutsch) Eingabepfad | Ausgabepfad | Dateityp | Blatt | Zeile übergeben oder
in zwei Schritten? Wenn in zwei Schritten müsste ich einen "Platzhalter" hier
einfügen.
@sonne75
Wo hast du das beschrieben/erklärt?
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „StGo“ ()
-
sonne75 schrieb:
Post #69, vor einer Woche:
sonne75 schrieb:
Zu dem Rest sagte ich schon, du machst es komplett falsch - es wird ROW erwartet, die Row bekommst du als Rückgabeparameter von AddXXRow(), .Stammdaten(i) ist der falsche Ansatz.
So geht das.
StGo schrieb:
Wo hast du das beschrieben/erklärt?
Ich verstehe nicht, ob du mich einfach verarschst oder wirklich so ...."Platzhalter".... bist.
-
Tags
-
Ähnliche Themen
-
StGo - - Daten(bank)programmierung
-
4 Benutzer haben hier geschrieben
- Gast (89)
- ErfinderDesRades (39)
- shaebich (26)
- VB1963 (7)