2

これを検索しましたが、必要な要件を正確に満たすものはないようです。シナリオは次のとおりです。

  1. File1、File2、File3、および File4 を含むリストがあります。このリストはリピーターにバインドされます。
  2. 各リピーター項目には DropDownList が含まれています。
  3. リピーターの ItemDataBound イベントを使用してリストを反復処理し、リストに格納されているすべてのアイテムのドロップダウンを作成して入力します。
  4. 最終結果は、ページ内のそのリスト項目に固有の値を持つ一連のドロップダウンを生成することです。

ただし、要件には変更があり、変更には次のものが含まれます。

  1. リストの現在の繰り返しが File1 の場合、File1 のみのドロップダウン リストが作成されます。次に、File2 と File3 の場合、新しいドロップダウンを作成する代わりに、File1 のドロップダウン ボタンに値を追加するだけです。
  2. リストの現在の反復が File4 の場合、新しいドロップダウンが再度作成されます。

File1 の ID を取得して、File2 と File3 に対して ItemDataBound イベントが発生したときに File1 の DropDownList を更新する方法はありますか? または、これを行う別の方法を検討する必要がありますか?

4

1 に答える 1

1

ItemDataBound イベント ハンドラー内で、DropDownList への参照を取得し、メンバー変数に格納できます。その変数を使用して、後続の ItemDataBound イベントで DropDownList へのアクセスを保持できます。

次のようなことをする必要があるようです:

public partial class _Default : System.Web.UI.Page
{
    // Dummy data class. We'll bind a list of these to the repeater.
    class File
    {
        public string Name { get; set; }
        public int ID { get; set; }
        public List<string> AListOfStrings { get; set; }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        rptrTest.ItemDataBound +=
            new RepeaterItemEventHandler(rptrTest_ItemDataBound);
    }

    private DropDownList file1DropDown;

    void rptrTest_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        // Find the DropDownList in the repeater's ItemTemplate
        // so we can manipulate it.
        DropDownList ddlSelect =
            e.Item.FindControl("ddlSelect") as DropDownList;
        File dataItem = (File)e.Item.DataItem;

        DropDownList currentDropDownList;
        switch (dataItem.ID)
        {
            case 1:
                // Store the current item's DropDownList for later...
                file1DropDown = ddlSelect;
                currentDropDownList = file1DropDown;
                break;
            case 2:
            case 3:
                currentDropDownList = file1DropDown;
                break;
            default:
                currentDropDownList = ddlSelect;
                break;
        }

        // Get all of the strings starting with the current ID and
        // add them to whichever DropDownList we need to modify.
        currentDropDownList.Items.AddRange((
            from s
            in dataItem.AListOfStrings
            where s.StartsWith(dataItem.ID.ToString())
            select new ListItem(s)).ToArray());
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Just build up a list of strings which we can filter later.
        List<string> stringList = new List<string>();
        foreach (string number in (new[] { "1", "2", "3", "4" }))
        {
            foreach (string letter in (new[] { "a", "b", "c", "d", "e" }))
            {
                stringList.Add(number + " " + letter);
            }
        }

        List<File> myObjects = new List<File>(new[]
        {
            new File { ID = 1, Name = "Foo", AListOfStrings = stringList },
            new File { ID = 2, Name = "Bar", AListOfStrings = stringList },
            new File { ID = 3, Name = "Baz", AListOfStrings = stringList },
            new File { ID = 4, Name = "Quux", AListOfStrings = stringList }
        });

        rptrTest.DataSource = myObjects;
        rptrTest.DataBind();
    }
}

... ASPX ページには、次のようなリピーターが含まれます。

<asp:Repeater runat="server" ID="rptrTest">
    <ItemTemplate>
        ID: <%#DataBinder.Eval(Container.DataItem, "ID")%>
        <br />
        Name: <%#DataBinder.Eval(Container.DataItem, "Name")%>
        <br />
        Select: <asp:DropDownList runat="server" ID="ddlSelect" />
        <br /><br />
    </ItemTemplate>
</asp:Repeater>

そのため、コード ビハインド ファイルのイベント ハンドラーには、バインド先のファイル インスタンスをrptrTest_ItemDataBound確認する switch ステートメントがあります。File.IDID が 1 の場合、DropDownList は に割り当てられfile1DropDownます。次に、後続のイベントで、残りのスイッチ ブロック内のロジックによって、変更する必要がある DropDownList が決定されます。

于 2012-04-22T04:45:25.083 に答える