c# - Seleccionar elemento de forma programática en Asp.Net ListView
listviewitem selecteditemtemplate (4)
Ampliando las respuestas de @Jeremy y @bendewey, no debería necesitar hacer esto en ItemDataBound. Solo necesita tener el enlace ListView ya realizado antes de establecer SelectedValue. Deberías poder hacer esto durante PreRender. Consulte los documentos de ciclo de vida de esta página para obtener más información sobre cuándo se realiza el enlace.
Después de hacer una búsqueda rápida no puedo encontrar la respuesta a esta cosa aparentemente simple de hacer.
¿Cómo selecciono manualmente un elemento en Asp.Net ListView?
Tengo un SelectedItemTemplate, pero no quiero usar un botón asp: o asp: LinkButton para seleccionar un elemento. Quiero que se haga desde una URL. Como un QueryString, por ejemplo.
La forma en que imagino estaría en ItemDataBound, verifica una condición y luego configúrala en seleccionada si es verdadera, pero ¿cómo hago esto?
Por ejemplo:
protected void lv_ItemDataBound(object sender, ListViewItemEventArgs e) {
using (ListViewDataItem dataItem = (ListViewDataItem)e.Item) {
if (dataItem != null) {
if( /* item select condition */ ) {
// What do I do here to Set this Item to be Selected?
// edit: Here''s the solution I''m using :
((ListView)sender).SelectedIndex = dataItem.DisplayIndex;
// Note, I get here and it gets set
// but the SelectedItemTemplate isn''t applied!!!
}
}
}
}
Estoy seguro de que es una o dos líneas de código.
EDITAR: He actualizado el código para reflejar la solución, y parece que puedo seleccionar el SelectedItemIndex de ListView, sin embargo, en realidad no está representando SelectedItemTemplate. No sé si debería hacer esto en el evento ItemDataBound como se sugiere a continuación .
Puede establecer ListViews SelectedIndex
list.SelectedIndex = dataItem.DisplayIndex; // don''t know which index you need
list.SelectedIndex = dataItem.DataItemIndex;
Actualizar
Si carga los datos en la carga de la página puede que tenga que recorrer los datos para encontrar el índice y luego establecer el valor de SelectedIndex antes de llamar al método DataBind ().
public void Page_Load(object sender, EventArgs e)
{
var myData = MyDataSource.GetPeople();
list.DataSource = myData;
list.SelectedIndex = myData.FirstIndexOf(p => p.Name.Equals("Bob", StringComparison.InvariantCultureIgnoreCase));
list.DataBind();
}
public static class EnumerableExtensions
{
public static int FirstIndexOf<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
int count = 0;
foreach(var item in source)
{
if (predicate(item))
return count;
count++;
}
return -1;
}
}
list.SelectedIndex = list.Items.IndexOf(item);
Miré algo de lo que está sucediendo en ListView debajo del capó y creo que este es probablemente el mejor enfoque.
void listView_ItemCreated(object sender, ListViewItemEventArgs e)
{
// exit if we have already selected an item; This is mainly helpful for
// postbacks, and will also serve to stop processing once we''ve found our
// key; Optionally we could remove the ItemCreated event from the ListView
// here instead of just returning.
if ( listView.SelectedIndex > -1 ) return;
ListViewDataItem item = e.Item as ListViewDataItem;
// check to see if the item is the one we want to select (arbitrary) just return true if you want it selected
if (DoSelectDataItem(item)==true)
{
// setting the SelectedIndex is all we really need to do unless
// we want to change the template the item will use to render;
listView.SelectedIndex = item.DisplayIndex;
if ( listView.SelectedItemTemplate != null )
{
// Unfortunately ListView has already a selected a template to use;
// so clear that out
e.Item.Controls.Clear();
// intantiate the SelectedItemTemplate in our item;
// ListView will DataBind it for us later after ItemCreated has finished!
listView.SelectedItemTemplate.InstantiateIn(e.Item);
}
}
}
bool DoSelectDataItem(ListViewDataItem item)
{
return item.DisplayIndex == 0; // selects the first item in the list (this is just an example after all; keeping it simple :D )
}
NOTAS
- ListView selecciona la plantilla que usará un elemento después de que se active el evento DataBinding. Entonces, si el SelectedIndex está configurado antes, entonces no se necesita más trabajo
- Al establecer SelectedIndex en cualquier lugar después de que DataBinding funcione, simplemente no obtiene SelectedItemTemplate. Para eso, has vuelto a vincular los datos; o reinstalar el SelectedItemTemplate en el ListViewItem. ¡asegúrese de borrar primero la colección ListViewItem.Controls!
ACTUALIZACIÓN He eliminado la mayor parte de mi solución original, ya que esto debería funcionar mejor y para más casos.