locked
WCF RIA Services in Silverlight 4 - Datagrid aktualisieren RRS feed

  • Frage

  • Hallo,

    ich habe mir einen Webcast von Dariusz Parys mit dem Thema "WCF RIA Services in SIlverlight 4" angeschaut.

    Dort wird gezeigt, wie Daten vom Server ohne großen Aufwand zB. in ein Datagrid geladen werden können.

    Nun bin ich an einem Punkt angelangt, an dem das Datagrid durch ein bestimmtes Event aktualisiert werden muss.

    Hat jemand eine Idee, wie ich das machen könnte ?

    Link zum Webcast:

    http://www.microsoft.com/germany/MSDN/webcasts/library.aspx?id=1032455102

    Donnerstag, 2. September 2010 06:11

Alle Antworten

  • Hallo A.,

    gute Wahl ... das geht auch sehr einfach.

     <Button Command="{Binding Path=<LoadCommand>, ElementName=deinObjektDomainDataSource}" 
      Content="Neuladen" Margin="3" Name="deinObjektDomainDataSourceLoadButton" />
    


    Weiterhin gibt es auch noch das RejectChangesCommand und das SubmitChangesCommand.


    ciao Frank
    Donnerstag, 2. September 2010 08:57
  • <sdk:DataGrid AutoGenerateColumns="False" Margin="20,0,0,0" Height="200" ItemsSource="{Binding ElementName=tblCfgMenuesDomainDataSource, Path=Data}" Name="tblCfgMenuesDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Width="400" SelectionChanged="tblCfgMenuesDataGrid_SelectionChanged">
      <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn x:Name="cMeIDColumn" Binding="{Binding Path=CMeID, Mode=OneWay}" Header="CMe ID" IsReadOnly="True" Width="SizeToHeader" />
        <sdk:DataGridTextColumn x:Name="cMeViewnameColumn" Binding="{Binding Path=CMeViewname}" Header="CMe Viewname" Width="SizeToHeader" />
      </sdk:DataGrid.Columns>
    </sdk:DataGrid>
    <Button HorizontalAlignment="Right" Command="{Binding Path=LoadCommand, ElementName=tblCfgMenuesDomainDataSource}" 
      Content="Neuladen" Margin="3" Name="tblCfgMenuesDomainDataSourceLoadButton" />

    Wenn ich es richtig verstanden habe, sollte es so aussehen.
    Scheint, ich habe da irgendwas falsch gemacht. So funktioniert es jedenfalls nicht mit dem neuladen.

    Donnerstag, 2. September 2010 09:22
  • Gibt es die GettblCfgMenues() Methode in Deinem DomainService, oder ist sie mit [Query] markiert?

    [QueryAttribute Class (System.ServiceModel.DomainServices.Server)]
    http://msdn.microsoft.com/en-us/library/system.servicemodel.domainservices.server.queryattribute(VS.91).aspx

    Ist sie public? Ist der Rückgabetyp von IEnumerable<T>, IQueryable<T> abgeleitet?

    Setze einen BreakPoint in dieser Methode ... kommt er dort an?
    Was genau heisst nicht funktionieren, eine Exception / keine Daten?
    Wenn keine Daten, prüfe, ob wirklich welche aus der Methode herauskommen.


    ciao Frank
    Donnerstag, 2. September 2010 09:33
  •     public IQueryable<tblCfgMenues> GetTblCfgMenues()
        {
          return this.ObjectContext.tblCfgMenues.OrderBy(c => c.CMeViewname);
        }
    

    Mit dem Breakpoint kommt er da scheinbar auch an. Sowohl beim betreten der Seite, als auch beim Klick auf den Neuladen-Button.

    Donnerstag, 2. September 2010 09:43
  • Weil viele meiner Fragen noch nicht beantwortet wurden, .... füge einmal folgende Zeile ein:

         var elemente = this.ObjectContext.tblCfgMenues.OrderBy(c => c.CMeViewname).ToList();

    Was/wieviel steht dann in "elemente" ?


    Allgemein sollte vielleicht noch dazu gesagt werden:
    Wird auf dem Client etwas geändert, sollte sich der "Neuladen" - Button automatisch ausgrauen (in inaktiv).
    Man muss dann entweder "Speichern" (SubmitChangesCommand) oder ein "RejectChanges" (RejectChangesCommand) ausführen, um den Button "Neuladen" wieder aktiv zu machen.

    Wiederholung der Frage: 
       -> Was genau heisst nicht funktionieren, eine Exception / keine Daten?

    Weiterhin ist bzgl. Load zu sagen, dass der DomainDataSource standardmäßig ein Load am Anfang durchführt, da er das Attribut AutoLoad="true" setzt. Deswegen kommt er da auch zweimal an. Insofern könntest Du das mal auf "false" setzen. Dann müsste "Neuladen" auf jeden Fall die Daten (nun sichtbar) holen.


    ciao Frank
    Donnerstag, 2. September 2010 11:12
  • Bei elemente steht "count = 34 ".

    Der Neuladen-Button wird nicht ausgegraut, sobald sich was ändert. Also egal ob Speichern/Abbrechen ausgegraut ist oder nicht, der Neuladen-Button ist aktiv.

     

    Das sieht bei mir aktuell so aus:

    Links auf der Seite hab ich Textboxen zum Bearbeiten von Daten und rechts ein Datagrid. Wenn ich im Datagrid eine Zeile auswähle,

    erscheinen links die entsprechenden Daten in den Textboxen. Links befinden sich dann auch die Buttons Speichern/Abbrechen.

    Sobald ich auf der linken Seite etwas ändere und dies gespeichert wird, müssen die geänderten Daten auch im Datagrid aktualisiert werden.

     

    Nun zum Punkt "nicht funktionieren": Ich ändere links einen Datensatz und speichere ab. Drücke dann auf den Neuladen-Button und im

    Datagrid sind immernoch die alten Daten zu sehen. So war das gemeint.

    Donnerstag, 2. September 2010 11:37
  • Hallo A.,

    ich habe es bei mir eben noch einmal ausprobiert - bei mir lädt er die Daten und aktualisiert diese, wenn die Query etwas anders zurückgibt mit diesem einfachen LoadCommand.

    Du könntest mal versuchsweise das LoadBehavior im Client explizit auf RefreshCurrent setzen (aber eigentlich ist das nicht nötig):

    namespace SilverDomainDemo.Web
    {
      public partial class DomainService1
      {
        public override System.ServiceModel.DomainServices.Client.
    LoadOperation Load(
          System.ServiceModel.DomainServices.Client.EntityQuery query,
          System.ServiceModel.DomainServices.Client.LoadBehavior loadBehavior,
          Action<System.ServiceModel.DomainServices.Client.LoadOperation
    callback, object userState)
        {
          return base.Load(query, LoadBehavior.RefreshCurrent, callback, 
    userState);
          // return base.Load(query, loadBehavior, callback, userState);
        }
      }
    }

    nimm auch mal einen normalen Button und schaue, ob der 
        (tblCfgMenuesDomainDataSource.CanLoad == true)
    ist. Wenn nicht, würde das Loaden by Design nicht funktionieren.

    _______________________

           > Nun zum Punkt "nicht funktionieren": Ich ändere links einen
           > Datensatz und speichere ab. Drücke dann auf den Neuladen-Button und im
           > Datagrid sind immernoch die alten Daten zu sehen. So war das gemeint.

    Das kommt dann auch auf die Update Methode im DomainService an.
    Ist sie denn implementiert? Wenn sie korrekt implementiert wäre, ist das Verhalten by design richtig - gewollt. Das Load gibt die Änderungen seit dem letzten Change zurück, bzw. soll dies tun.


    ciao Frank
    Donnerstag, 2. September 2010 13:42
  • Ich weiß grad nicht wo der Codeteil mit dem RefreshCurrent hingehört.

     

    tblCfgMenuesDomainDataSource .CanLoad wird als true angezeigt.

     

    Die Update Methode sieht so aus:

     

    public void UpdateTblCfgMenues(tblCfgMenues currenttblCfgMenues)
        {
          this.ObjectContext.tblCfgMenues.AttachAsModified(currenttblCfgMenues, this.ChangeSet.GetOriginal(currenttblCfgMenues));
        }

     

    Die Daten werden in der Datenbank selbst auch geupdated, nur auf der Designoberfläche bzw. im Datagrid nicht.

     

    EDIT: das mit dem autoload=true auf false setzen hab ich wohl iwie übersprungen.

    Hab das jetzt gemacht und solange das Datagrid leer ist, werden die daten auch geladen durch den Button.

    Jedoch nicht geupdatet.

    Donnerstag, 2. September 2010 14:01
  • Hallo Asobi,

         > Ich weiß grad nicht wo der Codeteil mit dem RefreshCurrent hingehört.

    in den Silverlight-Client.

    Beachte auch:

    [Silverlight 3 RIA controls and how they load - ASP.NET Debugging - Site Home - MSDN Blogs]
    http://blogs.msdn.com/b/tom/archive/2009/04/02/silverlight-3-ria-controls-and-how-they-load.aspx

     


    ciao Frank
    Mittwoch, 8. September 2010 09:46