Цикл в блоке кода по аргументу клика - PullRequest
0 голосов
/ 13 февраля 2010

В основном я пытаюсь отобразить список категорий. И если админ залогинен Я хочу показать несколько кнопок рядом с каждой категорией. Например, кнопка, чтобы удалить его. Проблема в том, что я не знаю, как передать параметр в функцию, которая выполняет действие.

Подобно тому, как я указываю, что при нажатии кнопки должна быть вызвана функция 'DeleteCat', но если я не могу передать идентификатор категории, которую нужно удалить, это не сработает.

Я знаю, что это можно сделать с помощью команд и повторителя, но это не вариант, я не могу использовать повторитель.

Так что, очевидно, это то, к чему я стремлюсь:

Но, конечно, это не работает.

    <%For Each Cat In Category.Children%>
        <p class="SubCategory">
            <%=Cat.Name%> 

            <%If User.Identity.Name = "Admin" Then%>
                <asp:LinkButton ID="LinkButton6" runat="server" OnClick="AddItem" Text="A+" CommandArgument=<%=Cat.ID %> />
            <%End If%>
        </p>
    <%Next %>

1 Ответ

0 голосов
/ 13 февраля 2010

Ваш обработчик события AddItem должен иметь возможность оценить отправителя события и CommandEventArgs

void AddItem(Object sender, EventArgs e)
{
    int result;
    bool returnValue;

    Button clickedButton = (Button)sender;
    returnValue = Int32.TryParse(clickedButton.CommandArgument, result);

    // then other stuff happens ...
}

См. Подробный пример здесь .

редактировать

Завершенный пример кода, предложенный Брэндоном.


Альтернативное решение с использованием CheckBoxList

    ...
    <script language="C#" runat="server">
        void Page_Load(Object Sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // bind data to controls
                this.itemRepeater.DataSource = Category.Children;
                this.adminList.DataSource = Category.Children;
                this.itemRepeater.DataBind();
                this.adminList.DataBind();
            }

            // set visibility according to user
            this.itemRepeater.Visible = (User.Identity.Name != "Admin");
            this.adminList.Visible = (User.Identity.Name == "Admin");
            this.adminButton.Visible = (User.Identity.Name == "Admin");
        }

        protected void AddItem(object sender, EventArgs e)
        {
            foreach(ListItem currentitem in this.adminList.Items)
            {
                if(currentitem.Selected)
                {
                    // do something with the selected value
                    int i;
                    bool isparsed = Int32.TryParse(currentitem.value, i);
                }
            }
        }
    </script>
</head>
<body>
    <form id="mainForm" runat="server">
        <asp:Repeater ID="itemRepeater" runat="server">
            <ItemTemplate>
                <p><%# DataBinder.Eval(Container.DataItem, "value") %></p>
            </ItemTemplate>
        </asp:Repeater>
        <asp:CheckBoxList ID="adminList" runat="server" />
        <br />
        <asp:Button ID="adminButton" OnClick="AddItem" runat="server" Text="Add seleted Items" />
    </form>
</body>
...