2008-12-08 12 views

Odpowiedz

9

ja skończyło się

 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

Czy za podejście Linq?

Zastosowanie:

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

Kod:

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

Przydałoby się odrobinę white-space, ale to jest całkiem miłe. – Kirk

+0

Zgadzam się. Dziękuję za komentarz. :-) –

+0

Wszystko, co zrobi ta metoda rozszerzenia, to zawsze zwraca -1. 'DataKeyArray' nie ma metody' IndexOf() ', jedynym powodem kompilacji jest to, że twoja metoda rozszerzenia nosi nazwę IndexOf. Tak więc, gdy zostanie osiągnięta pierwsza linia 'return keys.IndexOf (key)', wywoła ona ponownie tę samą metodę, tylko tym razem parametr 'value' będzie instancją' DataKey'. Co z kolei nie spełni predykatu 'k.Value.Equals (value)' i zwróci -1. Zobacz mój komentarz poniżej, aby zrobić to w jednym wierszu, bez metody rozszerzenia. –

3

Twoja metoda powyżej tylko przeszukuje aktualną stronę GridView, jeśli stronicowania jest włączony. Aby przeszukać cały GridView, musisz przejrzeć jego DataSource i użyć go, aby uzyskać odpowiednie wartości.

W moim przypadku musiałem dać użytkownikom szybki sposób wyszukiwania dla konkretnego klienta, więc dodałem AJAX włączony Combo Box oraz OnSelectedIndexChanged użyłem tego, aby zlokalizować odpowiedni GridView wiersz i wybrać go:

 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

umieścić coś takiego w swoim GridView_RowDataBound() wydarzenie:

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 

w tym przykładzie są wiążące GridView do kolekcji obiektów niestandardowych typu Catalog.Product i DataKey nazwie Bvin - będziesz musiał dostosować typ danych i nazwę klucza w zależności od tego, do czego jesteś zobowiązany.

Uwaga: zdarzenie to działa już raz w wierszu, więc nie ma potrzeby zapętlenia. Należy jednak zachować ostrożność, aby nie dopuścić do sytuacji, w których dostęp do danych wystąpi więcej niż raz.

2

Spróbuj podejście Linq:

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

Ok, większość z nich są błędne. Phil jest jedynym, który działa. Odpowiedź nie działa. Problem z odpowiedzią Phila polega na tym, że jest on powiązany z SQL DataTable w asp.net, którego nikt nie używa. Cóż, niektórzy tak robią, ale kiedy zaczniecie używać wzorów, które zostaną upuszczone.

Mój przykład zawiera szczegóły powtarzania wiersza po wierszu oraz przełączania indeksu stron i ponownego wiązania. Nie mogłem przeszukać rzeczywistej właściwości DataSource, ponieważ jest ona związana z kontrolką LinqDataSource i nie mogę uzyskać dostępu do rzeczywistych danych. Przeszukiwanie zasobu DataSource prawdopodobnie nie zadziałałoby, ponieważ przeszukujesz, sortujesz itp., Aby zmienić dane i pobieranie rzeczywistego indeksu wiersza nie będzie indeksem siatki (lub innego kontrolnego).

Użyłem ukrytego asp: HiddenControl, aby zachować wartość, ponieważ funkcja jQuery faktycznie wykonuje odświeżenie. grdLocations to 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; 
     } 

Spowoduje to wykonanie iteracji każdej strony w widoku siatki i wybór właściwego klucza danych.

Teraz, aby dodać, jeśli chcesz najprostszy sposób na znalezienie strony na podstawie wiersza, skorzystaj z tej matematyki w tej przykładowej aplikacji konsolowej. To sprawia, że ​​jest to naprawdę proste:

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(); 
    } 
} 

Mam nadzieję, że to pomoże komuś.

4

To działa i jest to miła i krótka:

 int MyId = 22; 

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

Zasadniczo, jeśli masz już instancję GridViewRow, to zrobić:

gridView.SelectedIndex = gridViewRowToBeSelected.RowIndex; 
Powiązane problemy