1 votes

ASP ListView : Comment accéder aux données liées aux lignes ?

Je veux accéder aux données qui ont été liées à ma vue de liste lors de la gestion des événements de la vue de liste tels que :

protected void List_ItemDataBound(object sender, ListViewItemEventArgs e)

ou

protected void List_ItemCommand(object sender, ListViewCommandEventArgs e)

Dans les événements, je ne peux pas accéder aux données via quelque chose comme Eval("ID")

Pour l'instant, nous utilisons une solution très peu pratique :

string id = e.Item.FindControl("lblID").Text;

lblID est un contrôle caché qui est alimenté en données dans le fichier aspx à l'aide de :

<asp:Label ID="lblID" runat="server" Text='<%# Eval("ID") %>' />

Mes yeux saignent quand je regarde cela, y a-t-il une meilleure solution ?

1voto

Graham Clark Points 9038

Dans vos gestionnaires d'événements, utilisez l'objet EventArgs.

e.Item.DataItem

vous donnera l'objet que vous recherchez ; il vous suffira alors de lui attribuer le type dont vous avez besoin.

Este Page MSDN présente un exemple plus complet.

Pour le gestionnaire d'événements ItemCommand, vous n'aurez peut-être pas cette option. Dans ce cas, j'utiliserais la méthode CommandName y CommandArgument les propriétés de la LinkButton (ou tout autre système que vous utilisez). Mettez votre ID comme CommandArgument, vous pouvez ensuite le récupérer dans l'objet argument de l'événement dans le gestionnaire d'événement.

1voto

Robert Points 10822

Après un peu de bricolage, j'ai trouvé la bonne solution :

Les clés de données doivent être ajoutées à la vue en liste. Les clés de données sont persistantes, contrairement aux données liées à une vue de liste. Pour définir la clé de données, il suffit de spécifier le nom dans la balise ListView :

<asp:ListView ID="MyListview" runat="server" DataKeyNames="ID" ...... 

Puis d'accéder aux clés de l'événement :

protected void MyListView_ItemCommand(object sender, ListViewItemEventArgs e)
{
    // Get the item index of the Item
    int itemIndex = ((ListViewDataItem)e.Item).DisplayIndex;

    // Extract the key and cast it to its data type.
    DataKey key = ((ListView)sender).DataKeys[itemIndex];
    int myId = (int) key;

    // Use ID to delete / modify the item in the SQL database....
}

1voto

Caph Points 11

Pour développer la solution ItemDataBoundEvent à laquelle vous avez fait allusion, il n'est pas nécessaire de passer par les DataKeys du ListView pour accéder aux données de l'ItemDataBoundEvent. La conversion de e.Item en ListViewDataItem vous permet d'accéder à la propriété DataItem, que vous pouvez ensuite convertir en type de données sous-jacent, ce qui vous donne un accès intellisense à chaque champ de données sous-jacent. Exemple:-

(ActualDataType)(((ListViewDataItem)e.Item).DataItem)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X