2009-09-28 4 views
0

J'ai un contrôle de répéteur qui génère une liste de liens à partir d'un SqlReader. J'essaie de créer un bouton à côté de chaque lien qui permettra à l'utilisateur de supprimer ce lien. Ma pensée originale était d'utiliser l'expression <% # Eval ("URL")%> dans le modèle d'élément comme ci-dessous. Cependant, le CommandArgument dans la méthode ItemCommand reviendrait toujours vide.SqlReader, commandes Repeater et problème CommandArgument

<asp:Repeater ID="rptLinks" runat="server" onitemdatabound="rptLinks_ItemDataBound" 
       onitemcommand="rptLinks_ItemCommand"> 
<ItemTemplate><a href="<%# DataBinder.Eval(Container.DataItem, "URL") %>" target="_blank"><%# DataBinder.Eval(Container.DataItem, "URL") %></a><asp:ImageButton visible="false" ID="btnDeleteLink" runat="server" ImageUrl="/Images/DeleteIcon.gif" CommandName="DELETE" CommmandArgument=<%#Eval("URL") %> /> 
</ItemTemplate> 
<SeparatorTemplate><br /></SeparatorTemplate> 
    </asp:Repeater> 

La prochaine chose que j'ai essayé était d'utiliser l'événement ItemDataBound pour définir le programatically CommandArgument, mais je ne peux pas savoir quoi jeter le e.Item.DataItem dans afin que je puisse faire référence à la [ « URL » ] Article.

protected void rptLinks_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    ImageButton btnDelete; 
    btnDelete = (ImageButton) e.Item.FindControl("btnDeleteLink"); 
    if (btnDelete != null) 
    { 
     btnDelete.Visible = (bool)ViewState["LinkEditing"]; 

     string URL = ((WhatTypeGoesHere)(e.Item.DataItem))["URL"].ToString(); 
     btnDelete.CommandArgument = URL; 

    } 
} 

Répondre

3

Vous pouvez lancer la DataItem à l'une des classes dans la chaîne d'héritage de votre lecteur qui mettent en œuvre IDataRecord:

// You could also cast to SqlDataReader, DbDataReader, or IDataReader 
string URL = ((IDataRecord)(e.Item.DataItem))["URL"].ToString(); 

lecteurs de données sont un peu confus, parce que les objets qui héritent de DbDataReader peuvent agir à la fois une source de données (grâce à son implémentation de IEnumerable) et en tant qu'objet représentant vos données (grâce à son implémentation de IDataRecord).

L'interface IDataRecord permet d'accéder aux valeurs de colonnes des enregistrements d'un lecteur de données (via la propriété Item et les différentes méthodes Get *). En d'autres termes, c'est comme si vous liez IEnumerable<IDataRecord> (mais pas vraiment, car DbDataReader implémente la version non générique de IEnumerable).

+0

Juste un commentaire: Ne devrait-il pas être possible d'obtenir la valeur ["URL"] sans connaître le type de la source de données? Disons à l'avenir que je veux changer la source de données en une structure datatable ou xml, n'y a-t-il pas moyen d'écrire le code ItemDataBound pour qu'il soit agnostique et fonctionne avec n'importe quelle source de données? – Aheho

+0

J'ai mis à jour ma réponse pour expliquer pourquoi cela n'est pas en cause ici. En gros, vous n'attachez pas votre code ItemDataBound à votre source de données, mais à votre objet. –

Questions connexes