【问题标题】:Accessing controls in the edititemtemplate of a listview访问列表视图的 edititemtemplate 中的控件
【发布时间】:2009-05-05 14:12:20
【问题描述】:

我正在使用 listview 控件。默认情况下,我使用编辑按钮显示项目模板。当按下编辑按钮时,列表视图切换到编辑项模板。我需要根据正在编辑的项目填充edititemtemplate中的控件之一-我尝试在ItemEditing事件(以及几乎所有其他事件)中访问控件(通过FindControl),但是控件只是不' t 似乎存在。我可以访问 itemtemplate 中的控件,但不能访问 edititemtemplate。

谁能告诉我如何访问列表视图的edititemtemplate中保存的控件,以及我应该从哪个事件中访问?

编辑 我正在尝试使用以下方式访问控件:

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>

编辑: 我已经使用类似于下面的代码迭代了列表视图中的所有控件,但该控件仍然不可见。 ItemEditing 事件是否在显示编辑模板之前触发?如果是这样,我可以使用什么事件来访问编辑模板控件?

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

**编辑:** 我可以在 listview 的 ItemCreated 事件中访问 edititemtemplate 中的控件,但是它们没有内容(我假设数据尚未绑定),所以我无法获得我需要做的键值查找以获取填充控件所需的数据。

【问题讨论】:

  • 您调用“FindControl”的代码以及声明性列表视图代码会有所帮助。
  • 这可能是一个错字,但在您的 ItemEditing 事件中,您正在寻找存在于您的 insertitem 模板中的“ListBox2”。您的 edititemtemplate 中的列表框是“ListBox3”。
  • 这是我发布的简化代码中的错字(不是真实代码) - 我现在会更正它。

标签: asp.net listview


【解决方案1】:

我已经找到了一种方法来做我需要做的事情,尽管我对此并不十分满意。

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

【讨论】:

  • 我在我的问答here 中对此答案进行了改进。几个月来,我一直被这个完全相同的问题困住,感谢这篇文章为我指明了正确的方向:)
【解决方案2】:

我不知道以前的版本,但在 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");
}

【讨论】:

    【解决方案3】:
    protected void ListView1_ItemUpdating(object sender, ListViewUpdateEventArgs e)
    {        
            ListBox myListBox = (ListBox)(((ListView)sender).EditItem.FindControl("ListBox1")); 
    }
    

    【讨论】:

      【解决方案4】:
      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”

      【讨论】:

        【解决方案5】:

        我通常使用 ItemDataBound 事件...检查 ListItemType Enum 中的其他选项

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

        【讨论】:

          【解决方案6】:

          这与公认的答案相似,但我认为它的作者确实在朝着这个方向努力:

          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")
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-28
            • 2011-01-09
            • 1970-01-01
            相关资源
            最近更新 更多