2008-12-08 3 views

Répondre

9

J'ai fini avec

 For n As Integer = 0 To myGridView.DataKeys.Count - 1 
      If myGridView.DataKeys(n).Value = myKeyObj Then 
       myGridView.SelectedIndex = n 
      End If 
     Next 
2
//grab the current datakeyValue 
int orderID = (int)this.GridView1.SelectedDataKey.Value; 

//do something 
gridView.databind(); 

//set back the selected row int the gridView 
for (int i = 0; i <= this.GridView1.DataKeys.Count - 1; i++) 
{ 
    if ((int)GridView1.DataKeys[i].Value == orderID) 
    { 
     this.GridView1.SelectedIndex = i; 
    } 
} 
5

Avez-vous envisagé une approche LINQ?

Utilisation:

GridView1.SelectedIndex = GridView1.DataKeys.IndexOf(id); 

code:

public static class WebControlsEx 
{ 
    public static int IndexOf(this DataKeyArray dataKeyArray, object value) 
    { 
     if (dataKeyArray.Count < 1) throw new InvalidOperationException("DataKeyArray contains no elements."); 
     var keys = dataKeyArray.Cast<DataKey>().ToList(); 
     var key = keys.SingleOrDefault(k => k.Value.Equals(value)); 
     if (key == null) return -1; 
     return keys.IndexOf(key); 
    } 
} 
+1

pourrait utiliser une touche de l'espace blanc, mais c'est plutôt sympa. – Kirk

+0

Je suis d'accord. Merci pour le commentaire. :-) –

+0

Tout ce que cette méthode d'extension fera est toujours de retour -1. 'DataKeyArray' n'a pas de méthode' IndexOf() ', la seule raison pour laquelle elle est compilée est que votre méthode d'extension s'appelle IndexOf. Ainsi, lorsque la première ligne 'return keys.IndexOf (key)' est atteinte, elle appelle de nouveau la même méthode, mais cette fois-ci, le paramètre 'value' sera une instance de' DataKey'. Qui à son tour ne satisfera pas le prédicat 'k.Value.Equals (value)' et retournera -1. Voir mon commentaire ci-dessous pour le faire en une ligne, sans méthode d'extension. –

3

Votre méthode ci-dessus ne recherche la page courante du GridView, si la pagination est activée. Pour rechercher l'ensemble de GridView, vous devez regarder dans son DataSource et l'utiliser pour obtenir les valeurs appropriées.

Dans mon cas, je devais donner aux utilisateurs un moyen rapide de rechercher un client spécifique, alors j'ai ajouté un AJAX activé Combo Box, et OnSelectedIndexChanged, j'ai utilisé ce pour localiser la ligne GridView appropriée et sélectionnez:

 Dim i As Integer, DataSetIndex As Integer 
     Dim SelectedRowIndex As Integer 
     Dim dv As DataView = ObjectDataSourceClients.Select 
     Dim dt As DataTable = dv.ToTable 

     For i = 0 To dt.Rows.Count - 1 
      If dt.Rows(i)("Client_ID") = ComboBoxClientSearch.SelectedValue Then 
       DataSetIndex = i 
       Exit For 
      End If 
     Next 

     GridViewAllClients.PageIndex = DataSetIndex \ GridViewAllClients.PageSize 
     SelectedRowIndex = DataSetIndex - (GridViewAllClients.PageSize * GridViewAllClients.PageIndex) 
     GridViewAllClients.SelectedIndex = SelectedRowIndex 

     GridViewAllClients.DataBind() 
+0

http://atominnovation.blogspot.com/2010/01/aspnet-search-gridview-and.html – Phil

1

Mettez quelque chose comme ça dans votre événement GridView_RowDataBound():

Dim p As Catalog.Product = CType(e.Row.DataItem, Catalog.Product) 
If p IsNot Nothing Then 

    If p.Bvin = MySpecificID Then 
     e.Row.RowState = DataControlRowState.Selected 
    End If 

End If 

dans cet exemple, nous lier les GridView à une collection d'objets personnalisés de type Catalog.Product et DataKey est nommé Bvin - vous devrez ajuster le type de données et le nom de la clé en fonction de ce à quoi vous vous liez.

Notez que cet événement s'exécute déjà une fois par ligne, il n'est donc pas nécessaire de boucler. Cependant, il faut veiller à éviter que des choses telles que l'accès aux données ne se produisent plus d'une fois.

2

Essayez cette approche Linq:

grdMyGrid.SelectedIndex = grdMyGrid.DataKeys.OfType<DataKey>().ToList<DataKey>().FindIndex(dk => (string)dk.Value == "myKey"); 
3

Ok, la plupart d'entre eux sont faux. Phil est le seul qui fonctionne. La réponse ne fonctionne pas. Le problème avec la réponse de Phil est qu'il est lié à un DataTable SQL dans asp.net, que personne n'utilise. Eh bien, certains le font, mais quand vous commencez à utiliser des modèles de conception qui est abandonnée.

Mon exemple détaille l'exécution ligne par ligne et la commutation de l'index de page et de la reliure. Je ne pouvais pas rechercher la propriété DataSource réelle car elle est liée à un contrôle LinqDataSource et je ne peux pas accéder aux données réelles. Et la recherche dans le DataSource ne fonctionnerait probablement pas parce que vous avez la recherche, le tri, etc. pour changer les données et saisir l'index de la ligne ne sera pas l'index de la grille (ou d'un autre contrôle).

J'ai utilisé un asp caché: HiddenControl pour conserver la valeur car une fonction jQuery exécute réellement la publication. grdLocations est le gridview

grdLocations.SelectedIndex = -1; 

     bool found = false; 
     int index = 0; 
     int pageIndex = 0; 
     for (int i = 0; i < grdLocations.PageCount; i++) 
     { 
      for (index = 0; index < grdLocations.DataKeys.Count; index++) 
      { 
       if (Convert.ToInt32(grdLocations.DataKeys[index].Value.ToString()) == Convert.ToInt32(hidCurrentRigId.Value)) 
       { 
        found = true; 
        break; 
       } 
      } 

      if (found) 
        break; 

      pageIndex++; 
      grdLocations.PageIndex = pageIndex; 
      grdLocations.DataBind(); 
     } 

     if (found) 
     { 
      grdLocations.PageIndex = pageIndex; 
      grdLocations.SelectedIndex = index; 
     } 

Cela itérer chaque page dans la vue de la grille et sélectionnez la clé de données correcte.Maintenant, pour ajouter si vous voulez la façon la plus simple de trouver une page basée sur la ligne, utilisez cette mathématique dans cet exemple d'application console. Cela maintient très simple

class Program 
{ 
    static void Main(string[] args) 
    { 
     int rowIndex = 27; 
     int pageCount = 7; 
     int currentPage = 3; 
     int pageSize = 10; 

     Console.WriteLine("Page = " + (rowIndex/pageSize).ToString()); 
     Console.WriteLine("Row = " + (rowIndex % pageSize).ToString()); 
     Console.ReadLine(); 
    } 
} 

Hope this helps quelqu'un.

4

Cela fonctionne et il est agréable et courte:

 int MyId = 22; 

     foreach (GridViewRow gvRow in gridview1.Rows) 
     { 
      if ((int)gridview1.DataKeys[gvRow.DataItemIndex].Value == MyId) 
      { 
       gridview1.SelectedIndex = gvRow.DataItemIndex; 
       break; 
      } 
     } 
0

En gros, si vous avez déjà l'instance du GridViewRow, faites ceci:

gridView.SelectedIndex = gridViewRowToBeSelected.RowIndex;