0

内部にテーブルがあるリストビューがあり、すべてのドロップダウンリストとファイルアップロードコントロールを取得する必要がありますが、findは何も返しません。これは私のコードです:

<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");
4

3 に答える 3

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
            }
        }
}
于 2012-07-09T12:23:55.293 に答える
0

これMyListView.Controls[0]は、これら2つを含まない内部コントロールを指しているためです。

デバッグして、コンテナコントロールがどれであるかを正確に見つけてから、ハードコードされたインデックスなしで直接アクセスしてみてください。行バインディング呼び出しのイベントパラメータを介してアクセスできます。

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;
于 2012-07-09T12:19:08.863 に答える
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");
    }
}
于 2012-07-09T12:25:00.490 に答える