Accessing controls in the edititemtemplate of a listview
Asked Answered
E

6

5

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.

Extracellular answered 5/5, 2009 at 14:12 Comment(3)
The code where you are calling 'FindControl' would be helpful, and also the declarative listview code.Snowball
This may be a typo but in your ItemEditing event your looking for 'ListBox2' which exists in your insertitem template. The listbox in your edititemtemplate is 'ListBox3'.Snowball
That's a typo in the simplified code I've posted (not in the real code) - I'll correct it now.Extracellular
E
8

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")
    }
}
Extracellular answered 5/5, 2009 at 15:55 Comment(1)
I have made improvements to this answer in my question & answer here. I had previously been stuck on this exact same problem for months, and thanks to this post for pointing me in the right direction :)Summation
C
4

I don't know about previous editions but in Visual Studio 2010 you can easily access the edit item trhough the "ListView.EditItem" property like this:

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

   ListViewItem lvwItem = lvwLista.EditItem;
   ListBox tempLB = (ListBox) lvwItem.FindControl("ListBox3");
}
Contumacy answered 21/12, 2010 at 11:1 Comment(0)
S
2
protected void ListView1_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{        
        ListBox myListBox = (ListBox)(((ListView)sender).EditItem.FindControl("ListBox1")); 
}
Systematology answered 4/1, 2011 at 18:3 Comment(0)
M
1
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"

Moonshiner answered 13/1, 2010 at 22:48 Comment(0)
A
1

I usually use the ItemDataBound Event... check the other options in ListItemType Enum

    protected void UnitLV_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.EditItem)
        {
                ListBox myListBox = (ListBox) e.Item.FindControl("ListBox3");
        }
    }
Aleph answered 21/1, 2012 at 13:55 Comment(0)
B
0

this is similar to the accepted answer, but I think its author was really driving towards this:

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")
    }
}
Basketry answered 16/2, 2012 at 21:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.