Procédure pas à pas : Édition des données d'un service de domaine
Dans cette procédure pas à pas, vous allez apprendre comment créer une interface qui permet à l'utilisateur de modifier les données affichées et d'enregistrer ces modifications dans les bases de données.
Lorsque vous avez ajouté des méthodes de mise à jour, d'insertion ou de suppression dans un service de domaine, vous pouvez créer une interface dans un client Silverlight qui permet aux utilisateurs de modifier les données. Toutes les modifications sont suivies dans un objet EntityChangeSet et soumises collectivement à l'appel de la méthode SubmitChanges.
Configuration requise
Cette procédure pas à pas, ainsi que les autres procédures du même type présentées dans la documentation des Services RIA WCF, nécessite au préalable l'installation et la configuration correctes de plusieurs programmes, tels que Visual Studio 2010 et le Developer Runtime et SDK Silverlight, en plus des Services RIA WCF et du kit de ressources des Services RIA WCF. Ces procédures nécessitent également l'installation et la configuration de SQL Server 2008 R2 Express with Advanced Services et l'installation de la base de données AdventureWorks OLTP et LT.
Vous trouverez des instructions détaillées pour satisfaire chacune de ces conditions préalables dans les rubriques du nœud Conditions préalables pour les Services RIA WCF. Suivez ces instructions avant de poursuivre, pour être sûr de rencontrer le moins de problèmes possibles en effectuant ces procédures pas à pas des Services RIA .
Cette procédure pas à pas suppose que vous avez suivi les instructions de Procédure pas à pas : Création d'une solution de Services RIA et poursuit avec l'application créée à l'aide de ces procédures.
Pour afficher et modifier des données d'un service de domaine
Ouvrez la solution RIAServicesExample de Procédure pas à pas : Création d'une solution de Services RIA.
Dans MainPage.xaml, modifiez l'interface pour permettre à l'utilisateur d'enregistrer ou de refuser des modifications dans le DataGrid.
Le XAML suivant ajoute un bouton Enregistrer les modifications, un bouton Refuser les modifications et un bloc de texte.
<Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="40"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <StackPanel HorizontalAlignment="Center" Grid.Row="0" Orientation="Horizontal"> <Button Content="Save Changes" Click="SaveButton_Click" Margin="5" x:Name="SaveButton"></Button> <Button Content="Reject Changes" Click="RejectButton_Click" Margin="5" x:Name="RejectButton"></Button> <TextBlock x:Name="ChangeText" VerticalAlignment="Center" Width="Auto"></TextBlock> </StackPanel> <data:DataGrid Grid.Row="1" Name="CustomerGrid" RowEditEnded="CustomerGrid_RowEditEnded"></data:DataGrid> </Grid>
Dans la page code-behind de MainPage.xaml, ajoutez des gestionnaires d'événements pour les événements de clic de bouton, un gestionnaire d'événements pour l'événement RowEditEnded, une méthode de rappel nommée
OnSubmitCompleted
et une méthode qui évalue les modifications en attente.Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) _customerContext.SubmitChanges(AddressOf OnSubmitCompleted, Nothing) End Sub Private Sub RejectButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) _customerContext.RejectChanges() CheckChanges() End Sub Private Sub CustomerGrid_RowEditEnded(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEditEndedEventArgs) CheckChanges() End Sub Private Sub CheckChanges() Dim changeSet = _customerContext.EntityContainer.GetChanges() ChangeText.Text = changeSet.ToString() Dim hasChanges = _customerContext.HasChanges SaveButton.IsEnabled = hasChanges RejectButton.IsEnabled = hasChanges End Sub Private Sub OnSubmitCompleted(ByVal so As SubmitOperation) If (so.HasError) Then MessageBox.Show(String.Format("Submit Failed: {0}", so.Error.Message)) so.MarkErrorAsHandled() End If CheckChanges() End Sub
private void SaveButton_Click(object sender, RoutedEventArgs e) { _customerContext.SubmitChanges(OnSubmitCompleted, null); } private void RejectButton_Click(object sender, RoutedEventArgs e) { _customerContext.RejectChanges(); CheckChanges(); } private void CustomerGrid_RowEditEnded(object sender, DataGridRowEditEndedEventArgs e) { CheckChanges(); } private void CheckChanges() { EntityChangeSet changeSet = _customerContext.EntityContainer.GetChanges(); ChangeText.Text = changeSet.ToString(); bool hasChanges = _customerContext.HasChanges; SaveButton.IsEnabled = hasChanges; RejectButton.IsEnabled = hasChanges; } private void OnSubmitCompleted(SubmitOperation so) { if (so.HasError) { MessageBox.Show(string.Format("Submit Failed: {0}", so.Error.Message)); so.MarkErrorAsHandled(); } CheckChanges(); }
Pour définir des métadonnées pour l'entité à mettre à jour
Dans le projet serveur, ouvrez la classe de métadonnées nommée Customer.metadata.cs ou Customer.metadata.vb.
Pour plus d'informations, consultez Procédure : Ajouter des classes de métadonnées.
Dans la classe de métadonnées, ajoutez l'attribut EditableAttribute avec la propriété AllowEdit définie avec la valeur false aux propriétés
CustomerID
etModifiedDate
.Vous appliquez l'attribut EditableAttribute à une propriété pour indiquer si la propriété est destinée à être modifiée par un utilisateur dans une application cliente. Lorsque vous affectez à la propriété AllowEdit la valeur false, la propriété est en lecture seule dans l'application cliente. Dans cet exemple, vous affichez les valeurs des propriétés
CustomerID
etModifiedDate
, mais ne voulez pas que l'utilisateur les modifie.Ajoutez l'attribut ExcludeAttribute à la propriété
rowguid
.Vous appliquez l'attribut ExcludeAttribute aux propriétés que vous ne voulez pas inclure dans le code généré pour le projet client. Dans cet exemple, il n'y a aucune raison d'exposer la propriété
rowguid
dans le projet client.Les éléments suivants montrent le contenu de la classe de métadonnées.
<MetadataTypeAttribute(GetType(Customer.CustomerMetadata))> _ Partial Public Class Customer Friend NotInheritable Class CustomerMetadata 'Metadata classes are not meant to be instantiated. Private Sub New() MyBase.New End Sub <Editable(False)> _ Public CustomerID As Integer <Editable(False)> _ Public ModifiedDate As DateTime <Exclude()> _ Public rowguid As Guid End Class End Class
[MetadataTypeAttribute(typeof(Customer.CustomerMetadata))] public partial class Customer { internal sealed class CustomerMetadata { // Metadata classes are not meant to be instantiated. private CustomerMetadata() { } [Editable(false)] public int CustomerID; [Editable(false)] public DateTime ModifiedDate; [Exclude] public Guid rowguid; } }
Ajoutez les instructions using ou Imports requises pour les espaces de noms, tels que System.ComponentModel.DataAnnotations et System.ServiceModel.DomainServices.Server.
Exécutez l'application (F5).
Remarquez que vous pouvez modifier les valeurs dans le DataGrid. Lorsque vous quittez la ligne vous avez modifiée, la valeur
ChangeText
est mise à jour avec une description des modifications en attente. Lorsque vous cliquez sur le bouton Enregistrer les modifications, les modifications des données sont enregistrées dans la base de données. Lorsque vous cliquez sur le bouton Refuser les modifications, toutes les modifications en attente sont annulées.