2008-12-08 18 views

Respuesta

9

he terminado con

 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

¿ha considerado un enfoque LINQ?

Uso:

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

Código:

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

podría usar un toque de espacios en blanco, pero esto es bastante agradable. – Kirk

+0

Estoy de acuerdo. Gracias por el comentario. :-) –

+0

Todo lo que este método de extensión hará es siempre devolver -1. 'DataKeyArray' no tiene un método' IndexOf() ', la única razón por la que compila es porque su método de extensión se llama IndexOf. Entonces, cuando se llega a la primera línea 'return keys.IndexOf (key)', volverá a llamar al mismo método, solo que esta vez, el parámetro 'value' será una instancia de' DataKey'. Que a su vez no satisfará el predicado 'k.Value.Equals (value)' y devolverá -1. Vea mi comentario a continuación para hacer esto en una línea, sin método de extensión. –

3

Su método anterior sólo se busca en la página actual del GridView, si está habilitada la paginación. Para buscar todo el GridView, debe buscar en su DataSource y usarlo para obtener los valores apropiados.

En mi caso, tenía que dar a los usuarios una forma rápida de buscar un cliente específico, por lo que añade un AJAX cuadro combinado, y OnSelectedIndexChanged, he utilizado este para localizar la fila GridView apropiado y seleccionarla:

 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

poner algo como esto en su GridView_RowDataBound() evento:

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 

en este ejemplo, estamos atando el GridView para una colección de objetos personalizados de tipo Catalog.Product y la DataKey lleva el nombre Bvin - Deberá ajustar el tipo de datos y el nombre de la clave dependiendo de a lo que te apegues.

Tenga en cuenta que este evento se ejecuta una vez por cada fila, por lo que no es necesario realizar un bucle. Sin embargo, se debe tener cuidado para evitar que ocurran cosas como el acceso a los datos más de una vez.

2

probar este enfoque LINQ:

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

Ok, la mayoría de los que están equivocados. Phil es el único que trabaja. La respuesta no funciona. El problema con la respuesta de Phil es que está vinculado a una SQL DataTable en asp.net, que nadie usa. Bueno, algunos lo hacen, pero cuando comienzas a usar patrones de diseño que se descartan.

Mi ejemplo detalla iterar fila por fila y cambiar el índice de página y volver a enlazar. No pude buscar la propiedad real de DataSource porque está vinculada a un control LinqDataSource y no puedo acceder a los datos reales. Y buscar el DataSource probablemente no funcione de todos modos porque tiene que buscar, ordenar, etc. para cambiar los datos y tomar su índice de fila real no será el índice de la cuadrícula (u otro control).

Utilicé un ASP oculto: HiddenControl para mantener el valor porque, en realidad, una función jQuery ejecuta la devolución de datos. grdLocations es la vista de cuadrícula

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

Esto iterará cada página en la vista de cuadrícula y seleccionará la clave de datos correcta.

Ahora, para agregar, si desea la forma más fácil de encontrar una página basada en la fila, utilice esta matemática en esta aplicación de consola de muestra. Esto lo hace realmente 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(); 
    } 
} 

Espero que esto ayude a alguien.

4

Esto funciona y es agradable y corto:

 int MyId = 22; 

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

Básicamente, si ya tiene la instancia de la GridViewRow, a continuación, hacer esto:

gridView.SelectedIndex = gridViewRowToBeSelected.RowIndex; 
Cuestiones relacionadas