Announcement

Collapse
No announcement yet.

Master/Detail: DataMember nicht gefunden - nanu?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Master/Detail: DataMember nicht gefunden - nanu?

    Hallo,

    alles läuft mit einem <u>typisierten DataSet incl. Relations</u> (NET 2.0). Ich wollte nun <b>zwei DataGridViews mit Master/Detail-Beziehung</b> nutzen, aber das klappt seltsamerweise nicht.

    Das Verfahren habe ich aus der NET-Doku abgeleitet: <i>Exemplarische Vorgehensweise: Erstellen eines Master-/Detailformulars mit zwei DataGridView-Steuerelementen in Windows Forms</i>

    // dp.ds ist das typ. Dataset
    // box5K_bindMaster und box5K_bindDetail sind BindingSource
    // das Dataset enthält beide Tabellen:
    // "Kategorie" und "Kateg_Original"
    box5K_bindMaster.DataSource = dp.ds;
    box5K_bindMaster.DataMember = "Kategorie";
    box5K_bindDetail.DataSource = box5K_bindMaster;
    box5K_bindDetail.DataMember = "Kateg_Original";

    Dennoch erhalte ich folgende <b>Exception zur Laufzeit:</b>
    "Die DataMember-Eigenschaft Kateg_Original kann in der DataSource nicht gefunden werden."

    Was kann ich übersehen haben? Jürgen

  • #2
    Hallo,
    angenommen, die beiden Tabellen <i>KDN</i> und <i>KDNTEL</i> sind in der Datenbank über einen Fremdschlüssel miteinander verbunden. Der DataSet-Designer stellt die Beziehung zwischen den Tabellen visuell dar. Der Eigenschaftsdialog der Relation zwischen KDN und KDNTEL listet den Relations-Name auf, der für die Detail-BindingSource als DataMember-Eigenschaft zugewiesen werden muss. Die Detail-BindingSource verwendet die Master-BindingSource als Datenquelle für die Eigenschaft <b>DataSource</b>. Die Detail-BindingSource verwendet den Relationsnamen für die Eigenschaft <b>DataMember</b>.

    Wenn die Konfiguration nicht visuell vorgenommen werden soll, könnte die Quelltextkonfigurierung so aussehen:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;">
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> tempdbDataSetTableAdapters.<span style="color: teal;">ANRTableAdapter</span> aTAANR;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> tempdbDataSetTableAdapters.<span style="color: teal;">TELTableAdapter</span> aTATEL;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> tempdbDataSetTableAdapters.<span style="color: teal;">KDNTableAdapter</span> aTAKDN;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> tempdbDataSetTableAdapters.<span style="color: teal;">KDNTELTableAdapter</span> aTDKDNTEL;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: teal;">tempdbDataSet</span> aDS;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: teal;">BindingSource</span> aBSMaster;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: teal;">BindingSource</span> aBSDetail;</p><p style="margin: 0px;">&nbsp;</p>
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> buttonBindingSource_Click(<span style="color: blue;">object</span> sender, <span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// typisierte DataSet-Instanz über die TableAdapter füllen</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aDS = <span style="color: blue;">new</span> <span style="color: teal;">tempdbDataSet</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTAANR = <span style="color: blue;">new</span> tempdbDataSetTableAdapters.<span style="color: teal;">ANRTableAdapter</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTAANR.Fill(aDS.ANR);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTATEL = <span style="color: blue;">new</span> tempdbDataSetTableAdapters.<span style="color: teal;">TELTableAdapter</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTATEL.Fill(aDS.TEL); </p>
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTAKDN = <span style="color: blue;">new</span> tempdbDataSetTableAdapters.<span style="color: teal;">KDNTableAdapter</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTAKDN.Fill(aDS.KDN);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTDKDNTEL = <span style="color: blue;">new</span> tempdbDataSetTableAdapters.<span style="color: teal;">KDNTELTableAdapter</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTDKDNTEL.Fill(aDS.KDNTEL); </p>
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Master-BindingSource</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBSMaster = <span style="color: blue;">new</span> <span style="color: teal;">BindingSource</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBSMaster.PositionChanged += <span style="color: blue;">new</span> <span style="color: teal;">EventHandler</span>(aBSMaster_PositionChanged);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBSMaster.DataSource = aDS;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBSMaster.DataMember = aDS.KDN.TableName;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Detail-BindingSource verwendet die Master-BindingSource als Datenquelle</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBSDetail = <span style="color: blue;">new</span> <span style="color: teal;">BindingSource</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBSDetail.DataSource = aBSMaster;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBSDetail.DataMember = <span style="color: maroon;">"FK__KDNTEL__KDNID__1273C1CD"</span>; </p>
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Datenbindung für das Master-DataGridView</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataGridView1.DataSource = aBSMaster;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Datenbindung für das Detail-DataGridView</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataGridView2.DataSource = aBSDetail;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p>
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> aBSMaster_PositionChanged(<span style="color: blue;">object</span> sender, <span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; toolStripStatusLabel1.Text = aBSMaster.Position.ToString(); </p>
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p>
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> buttonUpdate_Click(<span style="color: blue;">object</span> sender, <span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (<span style="color: blue;">this</span>.Validate())</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBSMaster.EndEdit();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTAKDN.Update(aDS.KDN);&nbsp;&nbsp;&nbsp; </p>
    <p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div&gt

    Comment


    • #3
      Danke Herr Kosch,

      das war der wichtige Hinweis:
      <pre> Die Detail-BindingSource verwendet den <b>Relationsnamen</b><br> für die Eigenschaft <b>DataMember.</b></pre>
      Weil DataMember als String und nicht als Objekt zugewiesen wird, habe ich dies im Beispiel der NET-Doku nicht erkannt.

      Gruß Jürgen Thoma

      Comment

      Working...
      X