views:

2549

answers:

2

I am working with the listview control. By default I am showing the itemtemplate with an edit button. When the edit button is pressed the listview switches to the edititemtemplate. I need to populate one of the controls in the edititemtemplate based on the item being edited - I've tried accessing the control (via FindControl) in the ItemEditing event (and pretty much every other event as well), however the controls just don't seem to exist. I can access controls in the itemtemplate ok, but not the edititemtemplate.

Can anyone let me know how I can access a control held within the edititemtemplate of a listview, and from which event I should do so?

EDIT I'm trying to access the control using this:

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

I've also tried in ItemDataBound and ItemCreated.

The listview declaration is:

 <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: I've iterated over all the controls in the listview using code similar to below, and the control is still not visible. Does the ItemEditing event fire before the edit template is shown? If so, what event can I use to access the edit template controls?

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

**EDIT: ** I can access the controls in the edititemtemplate in the listview's ItemCreated event, however none they have no content (I'd assume the data hasn't been bound yet), so I can't get the key-value I need to do a lookup to get the data I need to populate the control.

+3  A: 

I've figured out a way to do what I need to do, though I'm not terribly happy with it.

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

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

I believe I found a typo in the above function. The second line should be

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

What I did was replace "e.item" with "item"

Dave Moss