2009-04-24 7 views
0

J'ai un listview, où je place la source de données dans le code derrière - cela fonctionne très bien. Lorsque j'ajoute un autre listview (ou un contrôle de base de données) au itemtemplate du listview, et que je place la source de données pour ce contrôle dans le codebehind, les champs retournés par la requête semblent être indisponibles pour la listview imbriquée; ASP.NET renvoie l'erreur suivante: DataBinding: 'System.String' ne contient pas une propriété avec le nom 'j_Name'.Liaison de données listview imbriquée - propriété non trouvée?

Dans l'exemple ci-dessous, d_Description fonctionne correctement, tandis que j_Role renvoie l'erreur indiquée ci-dessus. Je peux voir les données renvoyées par la requête, et je sais que les noms des colonnes correspondent, alors quelle est l'origine de l'erreur (et comment puis-je la résoudre)?

page ASPX

<asp:ListView ID="LV1" runat="server"> 
    <LayoutTemplate> 
     <table runat="server" id="tblSummary"> 
      <tr runat="server" id="itemPlaceholder" /> 
     </table> 
    </LayoutTemplate> 
    <ItemTemplate> 
     <tr> 
      <td> 
       <%#Eval("d_Description")%> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <asp:ListView ID="LV2" runat="server"> 
        <ItemTemplate> 
         <%#Eval("j_Role")%> 
        </ItemTemplate> 
        <LayoutTemplate> 
         <asp:placeholder id="itemPlaceholder" runat="server" /> 
        </LayoutTemplate> 
       </asp:ListView> 
      </td> 
     </tr> 
    </ItemTemplate> 
</asp:ListView> 

CODE DERRIÈRE

var qry1 = from q in context.Descriptions select q.d_Description; 
LV1.DataSource = qualificationQry; 
LV1.DataBind(); 

var qry2 = from q in context.Roles select q.j_Role; 
LV2.DataSource = qualificationQry; 
LV2.DataBind(); 

EDIT: J'ai ajouté le code similaire à celui ci-dessous pour l'événement ItemDataBound du listview extérieur, et je suis encore la rencontre la même erreur. Vraisemblablement, je suis mal compris l'instructon?

protected void LV_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    using (dbDataContext context = new dbDataContext() 
    { 
     var qry2 = from q in context.Roles select q.j_Role; 

     ListView tempLV = (ListView)e.Item.FindControl("LV2"); 
     tempLV.DataSource = qry2; 
     tempLV.DataBind(); 
    } 
} 

EDIT: 2 Après avoir lu sur le web un peu plus (maintenant que j'ai une idée de ce qu'il faut rechercher) la réponse proposée semble être correcte - cependant, il ne fonctionne pas - peut-on suggérer Pourquoi?

EDIT: 3 Si je fossé la sortie des j_Name, et juste une chaîne hardcoded, il n'y a pas d'erreur, et la chaîne hardcoded Ouputs le nombre prévu de fois. Cela indiquerait que c'est juste le nom de la colonne (j_Name) qui est faux - même si je peux voir l'ensemble de données revenir de la requête avec ce nom de colonne exact.

EDIT: 4 L'a corrigé. Ceci est faux var qry2 = from q in context.Roles select q.j_Role; Ceci est correct var qry2 = from q in context.Roles select q;

Répondre

2

Vous devez lier la liste intérieure sur chaque ligne de la liste externe dans la ItemDataBoundEvent pour la liste extérieure.

donc ce code:

var qry2 = from q in context.Roles select q.j_Role; 
LV2.DataSource = qualificationQry; 
LV2.DataBind(); 

aura besoin d'aller dans un même gestionnaire pour les listes externes événement ItemDataBound:

protected void ContactsListView_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListViewItemType.DataItem) 
    { 
    // Bind the inner list on every repeat of the outer list 
    var qry2 = from q in context.Roles select q.j_Role; 
    LV2.DataSource = qualificationQry; 
    LV2.DataBind(); 
    } 
} 

Et sans doute vous aurez envie de filtrer les valeurs de l'intérieur liste basée sur une valeur de l'élément actuel de la liste externe

+0

Merci, mais pouvez-vous être un peu plus précis? – user9659

+0

édité pour être plus précis - il y a un lien vers les documents msdn pour ItemDataBound là aussi si vous avez besoin de plus d'informations –

+0

Voir mon edit à la question d'origine - J'ai fait ce que vous avez proposé et je suis toujours la même erreur (Je peux voir l'événement appelé, et les données qui reviennent de la base de données ok là, je reçois toujours l'erreur de propriété system.string si). – user9659

Questions connexes