Доступ к элементам управления в шаблоне редактирования представления списка - PullRequest
4 голосов
/ 05 мая 2009

Я работаю с контролем списка. По умолчанию я показываю шаблон элемента с кнопкой редактирования. Когда кнопка редактирования нажата, просмотр списка переключается на шаблон редактирования. Мне нужно заполнить один из элементов управления в шаблоне редактирования элемента на основе редактируемого элемента - я попытался получить доступ к элементу управления (через FindControl) в событии ItemEditing (и почти во всех остальных событиях), однако элементы управления просто не кажется, существует. Я могу получить доступ к элементам управления в шаблоне элемента, но не в шаблоне редактирования.

Может ли кто-нибудь сообщить мне, как я могу получить доступ к элементу управления, хранящемуся в шаблоне редактирования элемента списка, и из какого события мне следует это сделать?

EDIT Я пытаюсь получить доступ к элементу управления, используя это:

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

Я также пробовал в ItemDataBound и ItemCreated.

Объявление списка просмотра:

<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: Я перебрал все элементы управления в представлении списка, используя код, подобный приведенному ниже, и элемент управления все еще не виден. Происходит ли событие ItemEditing до отображения шаблона редактирования? Если да, какое событие я могу использовать для доступа к элементам управления шаблона редактирования?

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

** РЕДАКТИРОВАТЬ: ** Я могу получить доступ к элементам управления в edititemtemplate в событии ItemCreated списка, однако ни у одного из них нет содержимого (я бы предположил, что данные еще не связаны), поэтому я не могу получить значение ключа, которое мне нужно сделать поиск, чтобы получить данные, необходимые для заполнения элемента управления.

Ответы [ 6 ]

8 голосов
/ 05 мая 2009

Я нашел способ сделать то, что мне нужно, хотя я не очень доволен этим.

protected void UnitsLV_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (UnitsLV.EditIndex > -1)
    {
        // Controls within the edititemtemplate are available via e.Item.FindControl("controlname")
    }
}
4 голосов
/ 21 декабря 2010

Я не знаю о предыдущих выпусках, но в Visual Studio 2010 вы можете легко получить доступ к элементу редактирования, хотя свойство ListView.EditItem выглядит следующим образом:

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

   ListViewItem lvwItem = lvwLista.EditItem;
   ListBox tempLB = (ListBox) lvwItem.FindControl("ListBox3");
}
2 голосов
/ 04 января 2011
protected void ListView1_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{        
        ListBox myListBox = (ListBox)(((ListView)sender).EditItem.FindControl("ListBox1")); 
}
1 голос
/ 21 января 2012

Я обычно использую событие ItemDataBound ... проверьте другие параметры в ListItemType Enum

    protected void UnitLV_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.EditItem)
        {
                ListBox myListBox = (ListBox) e.Item.FindControl("ListBox3");
        }
    }
1 голос
/ 14 января 2010
protected void UnitsLV_ItemEditing(object sender, ListViewEditEventArgs e) 
{ 
    ListViewItem item = UnitsLV.Items[e.NewEditIndex]; 
    ListBox tempLB = (ListBox)e.item.FindControl("ListBox3"); 
} 

Мне кажется, я нашел опечатку в вышеупомянутой функции. Вторая строка должна быть

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

Что я сделал, так это заменил "e.item" на "item"

0 голосов
/ 17 февраля 2012

это похоже на принятый ответ, но я думаю, что его автор действительно стремится к этому:

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")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...