2010-10-12 3 views
4

Ceci est une question hypothétique qui m'a envoyé dans le jardin ... Dites que j'ai un gridview que je voudrais éditer ... donné une méthode qui lie les données ..Asp.Net GridView EditIndex situation de concurrence?

private void BindGridFirst() { 
     var data = new List<string>() { 
      "A","B","C","D","E","F" 
     }; 
     gridView.DataSource = data; 
     gridView.DataBind(); 
    } 

présument maintenant que je regarde cette page, et un autre utilisateur a venir et apporté quelques modifications aux données sous-jacentes, et je vais maintenant et cliquez sur le bouton Modifier pour modifier D ...

La méthode d'édition est assez simple:

protected void RowEdit(object sender, GridViewEditEventArgs e) { 
     gridView.EditIndex = e.NewEditIndex; 
     BindGridSecond(); 
    } 

Edit: Je me sens obligé de souligner, que cette méthode est utilisée dans à peu près tous les exemples en ligne, y compris ceux de Microsoft.

Cette méthode BindGridSecond() ressemble à ceci:

private void BindGridSecond() { 
     var data = new List<string>() { 
      "A", "AA", "B","C","D","E","F" 
     }; 
     gridView.DataSource = data; 
     gridView.DataBind(); 
    } 

Il est exactement la même, mais les données sont maintenant changé. Une fois les mises à jour de l'interface utilisateur, l'utilisateur est maintenant en mode édition par rapport à la ligne C.

Pas ce que l'utilisateur attendait ou voulait. Comment ce scénario devrait-il être géré pour éviter un tel problème?

Répondre

1

Personnellement, j'utilise la propriété DataKeyNames et SelectedDataKey sur GridView, de sorte que je puisse facilement obtenir la clé primaire de la ligne voulue par l'utilisateur, plutôt que de me fier à l'index de la grille.

En utilisant la clé primaire, vous n'avez pas de problèmes avec de nouveaux éléments ajoutés à la collection, comme dans votre exemple. De plus, l'utilisation de la clé primaire facilite le traitement de la pagination sur la grille, car vous n'avez pas à tenir compte du numéro de page et de l'index.

0

Imho il y a deux options:

Vous pouvez mettre en cache les données que vous souhaitez lier à la grille dans une session par exemple. Vous pouvez donc vérifier les modifications avant d'appeler la méthode BindGridSecond et alerter l'utilisateur si des modifications ont été effectuées pendant qu'il parcourait la page.

Dans l'option 2 vous mettre en cache à nouveau les données que vous liez dans la BindGridFirst-Méthode et juste travailler avec ces données pour les prochaines actions de publication. Vous n'avez donc pas à vous soucier des changements qui peuvent survenir lors de la navigation sur la grille.