2011-11-03 3 views
3

J'ai un site Web d'administration produit qui a été généré à l'aide de ASP.NET Dynamic Data et Entity Framework 4.1 (Code First).Dynamic Data with Entity Framework: lignes d'édition en bloc

J'ai commencé à créer un mode d'édition groupée de lignes. J'ai les contrôles d'édition pour les colonnes que je veux être en mesure de modifier en bloc (j'ai créé un nouvel attribut appelé EditableInBulk que je décore mes propriétés avec). J'ai également ajouté une nouvelle colonne dans le GridView avec une case à cocher qui indique si la ligne doit être modifiée en bloc ou non.

Il me reste maintenant à mettre à jour par programme les lignes que j'ai vérifiées avec "Edit".

Voici le code que j'utilise pour trouver les lignes qui ont été vérifiées, la chose manquante est de réellement mettre à jour les données et de persister.

 // Find all items that will be edited 
     foreach (GridViewRow row in GridView1.Rows) 
     { 
      if (row.RowType != DataControlRowType.DataRow) 
       continue; 

      // Fetch the item index of the rows that has "Edit" checked 
      var editMe = row.Cells[1].Controls.OfType<CheckBox>().Any(ch => ch.Checked); 
      if (editMe) 
      { 
       // Edit the fields in the row and persist 
      } 
     } 

Je devrais pouvoir utiliser la méthode UpdateRow dans le contrôle GridView. Mais avant cela, j'ai besoin de mettre à jour les champs dans la rangée.

Est-ce que quelqu'un a une idée de comment je pourrais y parvenir?

La chose est aussi qu'il doit être générique. Devrait travailler avec chaque type d'entité qui a des colonnes que j'ai décorées avec mon attribut personnalisé "EditableInBulk". Il ne peut donc pas y avoir d'entité spécifique persistante.

J'ai commencé à modifier le fichier List.aspx fourni avec le projet Dynamic Data.

Répondre

4

Ok, nous l'avons résolu.

Je vais vous expliquer les différentes parties pour réaliser une édition en vrac générique pour les données dynamiques avec Entity Framework Code First. La solution n'est pas belle. Mais ça fonctionne.

Créez un attribut (nous l'avons nommé EditableInBulk) dont vous décorez les propriétés dans votre classe Entity Framework POCO. Dans la List.aspx (générée automatiquement par Dynamic Data), ajoutez une colonne avec un contrôle CheckBox à votre grille de sorte que vous puissiez facilement sélectionner les lignes qui doivent être affectées par la mise à jour groupée.

Sur ItemDataBound sur le GridView, dans le HeaderRow, ajoutez un DynamicControl du type correct dans la colonne appropriée. Ajoutez uniquement DynamicControl si le MetaColumn en question est décoré avec EditableInBulk.

Créez un bouton ou déclenchez la mise à jour en bloc. Tout d'abord, récupérez les nouvelles valeurs de DynamicControl qui ont été créées dans HeaderRow.

Ensuite, parcourez les lignes de GridView (avec RowType == DataRow). Assurez-vous que la ligne actuelle a été sélectionnée comme "à éditer" (trouvez le contrôle CheckBox dans la nouvelle colonne et vérifiez la valeur).

Récupère l'ID d'entité de la ligne en cours. Mais vous devez d'abord calculer le numéro de ligne en fonction de la taille de la page et de la page. Sinon, cela ne fonctionnera pas si vous êtes sur une page autre que la première.

int index = row.DataItemIndex; 
if (GridView1.PageIndex > 0) 
{ 
    index = row.DataItemIndex - (GridView1.PageIndex)*GridView1.PageSize; 
} 
var entityId = Convert.ToInt32(GridView1.DataKeys[index].Value.ToString()); 

Instaurez un ObjectContext à partir de votre DataContext. Récupère le nom du type d'entité de la liste/de l'ensemble de données en cours.

string entityTypeName = GridView1.DataKeyNames[0].Substring(0, GridView1.DataKeyNames[0].Count() - 2); 

instancier un nouvel objet de type EntityKey avec l'aide de l'ID d'entité et entité. Obtenir l'objet qui sera édité avec l'aide du ObjectContext

var entityKey = new EntityKey(objectContext.DefaultContainerName + "." + entityTypeName + "s", GridView1.DataKeyNames[0], entityId); 

Notez la solution + « s » ... ça marche :) (heureux/triste).

var entity = objectContext.GetObjectByKey(entityKey); 

À l'aide de Reflection, définissez les nouvelles valeurs de propriété.

PropertyInfo prop = entity.GetType().BaseType.GetProperty(newValue.Key, BindingFlags.Public | BindingFlags.Instance); 
var typedValue = TypeDescriptor.GetConverter(prop.PropertyType).ConvertFrom(newValue.Value); 
          if (null != prop && prop.CanWrite) 
          { 
           prop.SetValue(entity, typedValue, null);       } 

Enregistrer l'entité nouvellement mise à jour! Je suppose qu'il existe plusieurs autres façons d'obtenir une mise à jour en masse, mais cela fonctionne. S'il y a une demande pour cela, j'ajouterai plus de code de notre solution. Je voulais juste que vous sachiez qu'il y a un moyen.