2010-01-07 5 views
0

Je sais que j'ai déjà fait quelque chose comme ça, mais je ne sais pas pourquoi cela ne fonctionne pas maintenant. J'ai un ListView avec quelques zones de texte. Je veux lire le texte de ces boîtes quand je clique sur un bouton (linkbutton, peu importe).Les champs de ListView ne sont pas affichés

 <asp:ListView runat="server" ID="lv_bar" EnableViewState="true"> 
      <LayoutTemplate> 
       <table> 
        <tr> 
         <th>Foo</th> 
        </tr> 
        <tr runat="server" id="itemPlaceholder"></tr> 
       </table> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <tr> 
        <td><asp:LinkButton ID="lb_delete" CausesValidation="false" runat="server" Text="Del" /></td> 
        <td><asp:TextBox id="txt_foo" runat="server" /></td> 
       </tr> 
      </ItemTemplate> 
     </asp:ListView> 
     <asp:LinkButton ID="lb_add" CausesValidation="false" runat="server" Text="Add" /> 

Et voici le code-behind pertinentes choses:

protected void Page_Load(object sender, EventArgs e) 
{ 
    lb_chapter_add.Click += lb_chapter_add_Click; 

    if (!IsPostBack) 
    { 
      lv_chapters.DataSource = new List<Foo>() { new Foo() { Name = "harbl"} }; 
      lv_chapters.DataBind(); 
     } 
    } 

void lb_add_Click(object sender, EventArgs e) 
{ 
    foreach (ListViewDataItem item in lv_bar.Items) 
    { 
     var txt_foo = (TextBox)item.FindControl("txt_foo"); 
     Response.Write("foo: " + txt_foo.Text); 
    } 
    Response.Write("<br />the end"); 
    Response.End(); 
} 

Mais ce que je vois quand je rentre du texte dans txt_foo et cliquez sur lb_add est juste « la fin ». Qu'est-ce que je fais mal ici?

+0

ne devrait-il pas être lv_bar dans le foreach? –

+0

ouais, désolé, j'essayais de généraliser le code réel avant de le coller - mais ce n'est pas le problème :) –

Répondre

1

Le problème que vous utilisez un objet non persistant comme DataSource.

En cliquant sur le bouton, vous générez une publication et lv_chapters ne contient aucun élément. Définir un point d'arrêt dans la ligne où se trouve le foreach et vous verrez que lv_chapters.Items en null, ou que sa propriété Count renvoie 0.

+0

Bon, j'ai remarqué ce comportement. Alors, que dois-je utiliser comme DataSource alors? –

+0

Une possibilité qui me vient à l'esprit est ObjectDataSource. Asp.net s'occupera automatiquement de la "persistance" de la source de données. Une autre solution consisterait à lier le ListView à chaque publication. Mais gardez à l'esprit que cela vous limite dans la mesure où vous ne pouvez pas avoir de contrôles dans cette listview qui génèrent un postback (comme un bouton image) car vous liez la liste sur chaque Page_Load et l'Event_Handler pour l'imagebutton ne sera jamais exécuté car vous détruisez l'événement déclenché si vous reliez la source de données avant l'appel de l'eventhandler. – citronas

+0

ObjectDataSource est logique, mais je continue à obtenir "Le type spécifié dans la propriété TypeName de ObjectDataSource n'a pas pu être trouvé" –

Questions connexes