2009-05-05 7 views
4

Je travaille avec le contrôle listview. Par défaut, je montre l'itemtemplate avec un bouton d'édition. Lorsque vous appuyez sur le bouton d'édition, la liste affiche le modèle d'édition. Je dois remplir l'un des contrôles du modèle d'édition en fonction de l'élément en cours d'édition. J'ai essayé d'accéder au contrôle (via FindControl) dans l'événement ItemEditing (et à peu près tous les autres événements). t semblent exister. Je peux accéder aux contrôles dans le modèle d'article, mais pas dans le modèle d'édition. Est-ce que quelqu'un peut me dire comment je peux accéder à un contrôle détenu dans le modèle edititem d'une liste, et à partir de quel événement je devrais le faire?Accès aux contrôles dans le modèle d'édition d'une vue de liste

EDIT Je suis en train d'accéder au contrôle en utilisant ceci:

protected void UnitsLV_ItemEditing(object sender, ListViewEditEventArgs e) 
{ 
    ListViewItem item = UnitsLV.Items[e.NewEditIndex]; 
    ListBox tempLB = (ListBox)e.item.FindControl("ListBox3"); 
} 

J'ai aussi essayé dans ItemDataBound et ItemCreated.

La déclaration listview est:

<asp:Content ID="Content1" ContentPlaceHolderID="ColumnA" runat="server"> 
    <asp:Panel ID="Panel1" runat="server"> 
     <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <ContentTemplate> 
       <asp:Panel ID="SummaryPnl" runat="server"> 
        <asp:ListView ID="UnitsLV" runat="server" DataSourceID="DataLDS" DataKeyNames="u_uid" 
         InsertItemPosition="LastItem" OnItemInserting="UnitsLV_ItemInserting" OnItemDataBound="UnitsLV_ItemDataBound" 
         OnItemCreated="UnitsLV_ItemCreated" onitemediting="UnitsLV_ItemEditing"> 
         <ItemTemplate> 
          <tr class="rowA"> 
           <td> 
            <asp:Label runat="server" ID="UnitIDLbl" Text='<%# Eval("u_uid")%>'></asp:Label> 
           </td> 
           <td> 
            <%# Eval("u_Title")%> 
           </td> 
           <td> 
            <asp:LinkButton ID="EditBtn" runat="server" CommandName="Edit" CommandArgument='<%#Eval("u_uid") %>' 
            Text="Edit" /> 
           </td> 
           <td> 
            <asp:LinkButton ID="DeleteBtn" runat="server" CommandName="Delete" CommandArgument='<%#Eval("u_uid") %>' 
            Text="Delete" /> 
           </td> 
          </tr> 
         </ItemTemplate> 
         <InsertItemTemplate> 
          <tr class="rowB"> 
           <td> 
            <br /> 
            &nbsp; 
           </td> 
           <td> 
            <br /> 
            <asp:TextBox ID="TitleTB" runat="server" Text='<% #Bind("u_Title")%>'></asp:TextBox> 
           </td> 
           <td> 
            <br /> 
            <asp:ListBox ID="ListBox3" runat="server"></asp:ListBox> 
            <asp:ListBox ID="ToBeDeletedLB" runat="server"></asp:ListBox> 
           </td> 
           <td> 
            <asp:LinkButton ID="InsertBtn" runat="server" CommandName="Insert" Text="Insert" /> 
           </td> 
           <td> 
            <asp:LinkButton ID="CancelBtn" runat="server" CommandName="Cancel" Text="Cancel" /> 
           </td> 
          </tr> 
         </InsertItemTemplate> 
         <EditItemTemplate> 
          <tr class="rowB"> 
           <td> 
            <br /> 
            <asp:Label runat="server" ID="UnitIDLbl" Text='<%# Bind("u_uid")%>'></asp:Label> 
           </td> 
           <td> 
            <br /> 
            <asp:TextBox ID="TitleTB" runat="server" Text='<% #Bind("u_Title")%>'></asp:TextBox> 
           </td> 
           <td> 
            <br /> 
            <asp:ListBox ID="ListBox3" runat="server"></asp:ListBox> 
            <asp:ListBox ID="ToBeDeletedLB" runat="server"></asp:ListBox> 
           </td> 
           <td> 
            <asp:LinkButton ID="UpdateBtn" runat="server" CommandName="Update" Text="Update" /> 
           </td> 
           <td> 
            <asp:LinkButton ID="LinkButton2" runat="server" CommandName="Cancel" Text="Cancel" /> 
           </td> 
          </tr> 
         </EditItemTemplate> 
         <LayoutTemplate> 
          <table id="Table2" runat="server" width="100%"> 
           <tr id="Tr1" runat="server"> 
            <td id="Td1" runat="server"> 
             <table id="itemPlaceholderContainer" runat="server" border="0" style="" width="100%"> 
              <tr id="itemPlaceholder" runat="server"></tr> 
             </table> 
            </td> 
           </tr> 
           <tr id="Tr2" runat="server"> 
            <td id="Td2" runat="server" style=""></td> 
           </tr> 
          </table> 
         </LayoutTemplate> 
        </asp:ListView> 
       </asp:Panel> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
    </asp:Panel> 
</asp:Content> 

EDIT: J'ai itéré tous les contrôles dans le listview en utilisant le code similaire ci-dessous, et le contrôle est toujours pas visible. L'événement ItemEditing est-il déclenché avant l'affichage du modèle d'édition? Si oui, quel événement puis-je utiliser pour accéder aux contrôles du modèle d'édition?

foreach (Control child in control.Controls) 
{ 
    Control result = Find(child, id); 
    if (result != null) 
    { 
     return result; 
    } 
} 

** EDIT: ** Je peux accéder aux commandes de la EditItemTemplate dans le cas ItemCreated du listview, mais aucun, ils ont pas de contenu (je suppose que les données n'a pas encore été lié), donc Je ne peux pas obtenir la valeur-clé dont j'ai besoin pour rechercher les données dont j'ai besoin pour remplir le contrôle.

+0

Le code où vous appelez « FindControl » serait utile, ainsi que le code déclaratif listview . – Phaedrus

+0

Il s'agit peut-être d'une faute de frappe, mais dans votre événement ItemEditing, vous recherchez "ListBox2" qui existe dans votre modèle d'insertitem. La zone de liste dans votre edititemtemplate est 'ListBox3'. – Phaedrus

+0

C'est une faute de frappe dans le code simplifié que j'ai posté (pas dans le vrai code) - Je vais le corriger maintenant. –

Répondre

8

J'ai trouvé une façon de faire ce que j'ai besoin de faire, même si je ne suis pas très heureux avec ça.

protected void UnitsLV_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    if (UnitsLV.EditIndex > -1) 
    { 
     // Controls within the edititemtemplate are available via e.Item.FindControl("controlname") 
    } 
} 
+1

J'ai apporté des améliorations à cette réponse dans ma question et réponse [ici] (http://stackoverflow.com/questions/8994152/accessing-controls-on-listview-edit-command). J'avais déjà été coincé sur ce même problème pendant des mois, et grâce à ce poste pour me pointer dans la bonne direction :) – Chiramisu

1
protected void UnitsLV_ItemEditing(object sender, ListViewEditEventArgs e) 
{ 
    ListViewItem item = UnitsLV.Items[e.NewEditIndex]; 
    ListBox tempLB = (ListBox)e.item.FindControl("ListBox3"); 
} 

je crois que je trouve une erreur dans la fonction ci-dessus. La deuxième ligne devrait être

ListBox tempLB = (ListBox)item.FindControl("ListBox3"); 

Ce que je ne faisais remplacer « e.item » avec « item »

4

Je ne sais pas, mais les éditions précédentes dans Visual Studio 2010, vous pouvez facilement accéder à l'élément d'édition trhough la propriété "ListView.EditItem" comme ceci:

private void myListView_ItemEditing(object sender, ListViewEditEventArgs e) 
{ 
    myListView.EditIndex = e.NewEditIndex; 
    myListView.DataBind(); 

    ListViewItem lvwItem = lvwLista.EditItem; 
    ListBox tempLB = (ListBox) lvwItem.FindControl("ListBox3"); 
} 
+0

c'est vrai – Madman

2
protected void ListView1_ItemUpdating(object sender, ListViewUpdateEventArgs e) 
{   
     ListBox myListBox = (ListBox)(((ListView)sender).EditItem.FindControl("ListBox1")); 
} 
1

J'utilise habituellement l'événement ItemDataBound ... vérifier les autres options listItemType Enum

protected void UnitLV_ItemDataBound(object sender, DataListItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.EditItem) 
     { 
       ListBox myListBox = (ListBox) e.Item.FindControl("ListBox3"); 
     } 
    } 
0

ce qui est similaire à la réponse acceptée, mais je pense que son auteur était vraiment conduit à ceci:

protected void UnitsLV_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    ListViewDataItem listViewDataItem = e.Item as ListViewDataItem; 
    if (UnitsLV.EditIndex == listViewDataItem.DataItemIndex) 
    { 
     // Controls within the edititemtemplate are available via e.Item.FindControl("controlname") 
    } 
} 
Questions connexes