ListView在表格中找到下拉列表

时间:2012-07-09 12:16:24

标签: asp.net listview findcontrol

我有一个包含表格的列表视图,我需要获取所有下拉列表和文件上传控件,但查找没有返回任何内容。这是我的代码:

<asp:ListView runat="server" ID="MyListView" OnItemDataBound="FillDropDownList">
    <LayoutTemplate>
        <table border="0" cellpadding="2" cellspacing="0">
        <tr>
        <th>Wholesaler</th>
        <th>Import</th>
        <th>Period</th>
        <th>Upload Date</th>
        <th>Upload</th>
        </tr>
            <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
    </table>
    </LayoutTemplate>
    <ItemTemplate>
    <tr class="row1">
        <td><%# DataBinder.Eval(Container.DataItem, "Wholesaler") %></td>
            <td><%# DataBinder.Eval(Container.DataItem, "Import")%></td>
        <td><%# DataBinder.Eval(Container.DataItem, "Period")%></td>
        <td><asp:DropDownList runat="server" ID="DaysDropDownList"></asp:DropDownList></td>
       <td><asp:FileUpload ID="FileUpload" runat="server" /></td>
    </tr>
    </ItemTemplate>
</asp:ListView>

DropDownList dr = (DropDownList)MyListView.Controls[0].FindControl("DaysDropDownList");
FileUpload fl = (FileUpload)MyListView.Controls[0].FindControl("FileUpload");

3 个答案:

答案 0 :(得分:1)

想通了......你得到了那个错误,因为列表视图还没有绑定,所以我认为最好的方法是在ItemDataBound事件上做所有这些。您会找到如下的下拉列表:

protected void FillDropdownlist(object sender, ListViewItemEventArgs e)
    {

     if (e.Item.ItemType == ListViewItemType.DataItem)
        {
            DropDownList dr = (DropDownList)e.Item.FindControl("DaysDropDownList");
            FileUpload fl = (FileUpload)e.Item.FindControl("FileUpload");

            if (dr!= null)
            {
                //code here
            }
        }
}

答案 1 :(得分:0)

那是因为MyListView.Controls[0]指向一个不包含这两个的内部控件。

尝试调试并精确查找哪个是容器控件,然后直接访问它而不使用硬编码索引。它可以通过行绑定调用的事件参数访问。

我也建议您使用as运算符,因为它不会引发异常:

  

as运算符就像一个强制转换器,除了它在转换失败时产生null而不是引发异常

DropDownList dr = e.Item.FindControl("DaysDropDownList") as DropDownList;
FileUpload fl = e.Item.FindControl("FileUpload") as FileUpload;

或之后

//Loop i for the items of your listview
DropDownList dr = MyListView.Items[i].FindControl("DaysDropDownList") as DropDownList;
FileUpload fl = MyListView.Items[i].FindControl("FileUpload") as FileUpload;

答案 2 :(得分:0)

您需要遍历列表视图的Items集合,然后对每个项目使用FindControl。这样的事情会让你走上正轨:

foreach (var lvItem in MyListView.Items)
{
    if (lvItem.ItemType == ListViewItemType.DataItem)
     {
        DropDownList dr = (DropDownList)lvItem.FindControl("DaysDropDownList");
        FileUpload fl = (FileUpload)lvItem.FindControl("FileUpload");
    }
}