locked
Grid und DataForm RRS feed

  • Frage

  • Hallo,

    ich suche nach einem Beispiel Master (Grid:Tabelle1) - Detail (DataForm:Tabelle2) für
    Silverlight 4.

    Meine letzte Frage "DataForm und Grid (Master-Detail)" hat leider, trotz ausführlicher Anweisung
    von Frank, zu keinem Ergebniss geführt. In den Datenquellen sind beide Tabellen zwei mal
    mit ihren jeweiligen Verknüpfungen (Adressen-Bestelldetails bzw. Bestelldetails-Adressen) aufgeführt.
    Ziehe ich die Adressen als "Details" und die Bestelldetails als DataForm auf eine Page, so scheinen sie
    nicht in einer Verbindung zu stehen. Die DataForm weist keinerlei Datenbindung im Code auf.
    Das Grid mit den Adressen dagegen zeigt in Verbindung mit einem DataPager seine Daten an.

     

    Grüße aus Oberhausen,

    Steffen

    Dienstag, 26. Oktober 2010 05:49

Antworten

  • DataForm und DataGrid als Master/Details

    L Ö S U N G:

    Zunächst einmal ein Dank an alle die mir zur Lösung meiner Frage beigetragen haben.

    Nun zur vollständigen Vorgehnsweise:

    - Tabellen (z.B. tblAdressen und tblBestellDatails) mit ihren Verknüpfungen auf dem SQL Server anlegen

    - Neues Projekt aufrufen

    - Entity Data Model erzeugen

    - Projekt neu erzeugen

    - Domain Service Class anlegen (erzeugt bei Belassung der Vorgaben: DomainService1.metadata.vb und DomainService1.vb)

    - Tabelle tblAdresse aus den Datenquellen auf ein Grid einer Page z.b. (Page1) ziehen

    - Tabelle tblBestellDetails aus den Datenquellen und dort wiederum aus dem Ordner tblAdressen ebenfalls auf das Grid ziehen.

    - DomainService1.metadata.vb aufrufen und ein <include()> _ über Public Property tblAdressen... hinzufügen das dann so aussieht:

      <Include()> _
      Public Property tblAdressen As EntityCollection(Of tblAdressen)


    - In der DomainService1.vb folgende Funktion hinzufügen:

      Public Function GetTblAdressenwithtblBestellDetails() as IQeryable(Of tblAdressen)
            Return Me.ObjectContext.tblAdressen.Include("tblBestellDetails")
      End Function
     
    - Im Page1.xaml den QueryName der DomainDataSource ändern, das dann so aussehen könnte:

      <riaControls:DomainDataSource
            Autoload="True"
            d: DataContext="..............."
            Name="eventDomainDataSource"
            QueryName="GetTblAdressenWithTblBestellDetailsQuery"
            Witdh="0"
          .......
              ........
          ........
      </riaControls:DomainDataSource>


    Das war es schon.


    In meiner Lösung ist der Master eine DataForm und hat die Datenbindung:

    ItemsSource={Binding Data, ElementName=tblAdressenDomainDataSource}"


    Details ist bei mir sowohl eine DataForm als auch ein DataGrid und haben die Datenbindung:

    ItemsSource="{Binding Source={StaticResource TblAdressenTblBestellDetailsViewSource}}"

    Ich hoffe, dass ich gerade für Einsteiger nichts vergessen habe.

    Grüße,

    Steffen

     

    • Als Antwort markiert Steffen01 Mittwoch, 3. November 2010 17:00
    Mittwoch, 3. November 2010 16:59

Alle Antworten

  • Hallo Robert,

    danke für die Links. Ich habe die darin aufgeführten Beispiele bei mir
    nachvollziehen können und sie funktionieren.

    Nur handelt es sich bei den Beispielen um Grids, sowohl bei Master als
    auch beim Detail.

    Versuche ich als Detail eine DataForm darzustellen komme ich zu keinem
    Ergebnis. Beispiele die ich hierfür finden konnte nutzen immer nur eine gemeinsame
    Tabelle. Sowohl für den Master als auch für Detail. Aber wie bereits geschrieben
    suche ich nach der Möglichkeit zwei miteinander verknüpfte Tabellen jeweils als
    Master (Grid) bzw. Detail(DataForm) darzustellen.

    Grüße,

    Steffen

    Dienstag, 26. Oktober 2010 21:15
  • Hallo Robert,

    vieleicht bietet sich eine andere Möglichkeit meine Anfrage zu lösen.

    Da ich Blend4 einsetze, könnte dieses vielleicht weiter helfen, wenn jemand die
    Vorgehensweise beschreiben kann.

    Grüße,

    Steffen

    Donnerstag, 28. Oktober 2010 19:26
  • Hallo Robert,

    der Link http://silverlightfeeds.com/post/1770/Lookups_in_DataGrid_and_DataForm_with_RIA_Services.aspx
    stellt eine Lösung vor, wie sie in etwa meiner Frage entspricht.

    Nur an einer Stelle komme ich nicht weiter und zwar in dem Bereich "MetaData Class for the Model".
    Hier wurde festgelegt:

    [include]
    [Display(Order = 0)]
    public Make Make { get; set; }

    In VB würde es für mich heißen, dass eine Property Make() as Make definiert wird
    und dies führt zu einer Fehlermeldung.

    Vielleicht könntest Du, oder jemand anderes, mir diesen Property-Abschitt in VB übersetzen?


    Grüße,

    Steffen

    • Bearbeitet Steffen01 Freitag, 29. Oktober 2010 19:49 Syntaxfehler
    Freitag, 29. Oktober 2010 19:47
  • Hallo Steffen,

    mit Visual Basic 2010 sieht es fast genauso aus, wenn man automatisch implementierte Eigenschaften verwendet:

    <include> _
    <Display(Order := 0)> _
    Public Property Make As Make
    

    ansonsten kannst Du einen der Online Konverter zu Hilfe nehmen, z. B.:
    http://www.developerfusion.com/tools/convert/csharp-to-vb/

    (kennt noch nicht die aktuellen Möglichkeiten)

    Gruß Elmar

    Freitag, 29. Oktober 2010 20:15
  • Hallo Elmar,

    ich benutze seit längeren den von Dir empfohlenen Konverter.
    Seine Übersetzung lautet:

    Private m_Make As Make

     <Include> _
     <Display(Order := 0)> _
     Public Property Make() As Make
      Get
       Return m_Make
      End Get
      Set
       m_Make = Value
      End Set
     End Property

    Nach Neuerstellung des Projektes erhalte ich zu dieser Property die Fehlermeldung:

    Eigenschaften oder Felder: Stellen Sie sicher, dass die Namen dieser Member mit den Eigenschaftennamen des Haupttyps überinstimmen.

    Grüße,

    Steffen

     

    Freitag, 29. Oktober 2010 20:27
  • Hallo Steffen,

    Dein Problem dürfte daran liegen, dass Dein DomainService Model nicht entsprechend
    aufgebaut ist. Anhand des knappen Codeschnipsels kann ich das aber nicht beurteilen.
    (Und auch das Beispiel auf der Seite glänzt nicht mit Vollständigkeit)

    Du müsstest hier eine Klasse Make im gleichen Namensraum haben.

    Wie schon angedeutet der Konverter unterstützt die automatischen Eigenschaften (noch) nicht -
    das Endresultat ist hier aber das gleiche.

    Ich empfehle Dir Dich mit den Erweiterungen von VB 2010 zu beschäftigen,
    man muß sich das Progammieren ja nicht schwieriger als notwendig gestalten ;-)
    Die automatischen Eigenschaften sind nur eine davon, siehe u. a.:
    Neues in Visual Basic 2010

    Gruß Elmar

    Samstag, 30. Oktober 2010 08:59
  • Hallo Elmar,

    OK :-)

    Unabhängig von meinen bisherigen Lösungsversuchen bin ich einen neuen Weg gegangen.

    Dazu habe ich zwei DataFormen und eine Textfbox(txtFilter) angelegt:

    - Die eine DataForm enthält die Adressen, die andere die Bestelldetails.
    - Verknüpft sind beide Tabellen( tblAdressen, tblBestelldetails) mit ID und ID_Adresse.
    - Des weiteren:

    <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:tblAdressen, CreateList=true}"
                                          Height="0"
                                          Name="Tblmy:tblAdressenDomainDataSource"
                                          QueryName="GetTblAdressenQuery"
                                          Width="0"
                                          Margin="0,0,327,600">
                <riaControls:DomainDataSource.DomainContext>
                    <my:DomainService1 />
                </riaControls:DomainDataSource.DomainContext>
            </riaControls:DomainDataSource>

            <riaControls:DomainDataSource AutoLoad="True" d:DesignData="{d:DesignInstance my:tblBestelldetails,CreateList=true}"
                                          Height="0"
                                          Name="TblBestelldetailsDomainDataSource"
                                          QueryName="GetTblBestelldetailsQuery"
                                          Width="0"
                                          Margin="0,0,327,600">
                <riaControls:DomainDataSource.DomainContext>
                    <my:DomainService1 />
                </riaControls:DomainDataSource.DomainContext>
               
                <riaControls:DomainDataSource.QueryParameters>
                    <riaControls:Parameter ParameterName="filter" Value="{Binding ElementName=txtFilter, Path=Text}" />
                </riaControls:DomainDataSource.QueryParameters>
            </riaControls:DomainDataSource>

    - DomainService1.vb:

    Public Function GetTblBestelldetails(ByVal filter As String) As IQueryable(Of tblBestelldetails)
         Return Me.ObjectContext.tblBestelldetails.OrderBy(Function(c) c.ID).Where(Function(s) CType(s.ID_Adresse, String) = filter)
    End Function

    Gebe ich nach Aufruf des Projektes eine gültige ID_Adresse in die Textbox(txtFilter) ein, so bekomme ich alle Datensätze angezeigt, die diese beinhalten.

    Jetzt wäre es nur noch erforderlich die Textbox zu ersetzen und stattdessen das Textfeld(ID) nunmehr der DataForm(Adressen) die Filterfunktion übernehmen zu lassen.

    Also ....CType(s.ID_Adresse, String) = filter) durch ....CType(s.ID_Adresse, String) = "ID von DataForm(Adressen)") zu ersetzen.

    Nur wie das kurz und bündig zu machen ist? Wenn ja, sind weitgehend alle Funktionen meiner Anfrage gegeben.

    Grüße,

    Steffen

    • Bearbeitet Steffen01 Samstag, 30. Oktober 2010 13:22 Format
    Samstag, 30. Oktober 2010 10:03
  • DataForm und DataGrid als Master/Details

    L Ö S U N G:

    Zunächst einmal ein Dank an alle die mir zur Lösung meiner Frage beigetragen haben.

    Nun zur vollständigen Vorgehnsweise:

    - Tabellen (z.B. tblAdressen und tblBestellDatails) mit ihren Verknüpfungen auf dem SQL Server anlegen

    - Neues Projekt aufrufen

    - Entity Data Model erzeugen

    - Projekt neu erzeugen

    - Domain Service Class anlegen (erzeugt bei Belassung der Vorgaben: DomainService1.metadata.vb und DomainService1.vb)

    - Tabelle tblAdresse aus den Datenquellen auf ein Grid einer Page z.b. (Page1) ziehen

    - Tabelle tblBestellDetails aus den Datenquellen und dort wiederum aus dem Ordner tblAdressen ebenfalls auf das Grid ziehen.

    - DomainService1.metadata.vb aufrufen und ein <include()> _ über Public Property tblAdressen... hinzufügen das dann so aussieht:

      <Include()> _
      Public Property tblAdressen As EntityCollection(Of tblAdressen)


    - In der DomainService1.vb folgende Funktion hinzufügen:

      Public Function GetTblAdressenwithtblBestellDetails() as IQeryable(Of tblAdressen)
            Return Me.ObjectContext.tblAdressen.Include("tblBestellDetails")
      End Function
     
    - Im Page1.xaml den QueryName der DomainDataSource ändern, das dann so aussehen könnte:

      <riaControls:DomainDataSource
            Autoload="True"
            d: DataContext="..............."
            Name="eventDomainDataSource"
            QueryName="GetTblAdressenWithTblBestellDetailsQuery"
            Witdh="0"
          .......
              ........
          ........
      </riaControls:DomainDataSource>


    Das war es schon.


    In meiner Lösung ist der Master eine DataForm und hat die Datenbindung:

    ItemsSource={Binding Data, ElementName=tblAdressenDomainDataSource}"


    Details ist bei mir sowohl eine DataForm als auch ein DataGrid und haben die Datenbindung:

    ItemsSource="{Binding Source={StaticResource TblAdressenTblBestellDetailsViewSource}}"

    Ich hoffe, dass ich gerade für Einsteiger nichts vergessen habe.

    Grüße,

    Steffen

     

    • Als Antwort markiert Steffen01 Mittwoch, 3. November 2010 17:00
    Mittwoch, 3. November 2010 16:59