1

我是一个完整的 asp.net 菜鸟,解决方案可能非常简单。

我已经找到、阅读并尝试了许多与我的问题非常相似的问题的答案,但没有任何效果。我希望在这里找到一些帮助。

这完美无缺:

    <asp:Repeater ID="Repeater1" runat="server" onitemcommand="Repeater1_ItemCommand">
        <ItemTemplate>
            <asp:Button ID="Button1" runat="server" Text='<%# (Container.DataItem as Choice).description %>' CommandName="Choice" CommandArgument='<%# (Container.DataItem as Choice).id %>'/>
            <br />
        </ItemTemplate>
    </asp:Repeater>

后面的代码:

void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        List<Choice> choiceList = new List<Choice>();
        // ... code to fill the list ...
        Repeater1.DataSource = choiceList;
        Repeater1.DataBind();
    }
}
void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    int idx = int.Parse( e.CommandArgument.ToString() );
    // this function is called
}

但如果我使用 ITemplate 它不起作用:

    <asp:Repeater ID="Repeater1" runat="server" onitemcommand="Repeater1_ItemCommand">
    </asp:Repeater>

后面的代码:

public class MyButtonTemplate : System.Web.UI.ITemplate
{
    public void InstantiateIn(System.Web.UI.Control container)
    {
        Button button = new Button();
        button.CommandName = "choice";
        button.DataBinding += new EventHandler(Button_DataBinding);
        container.Controls.Add(button);
        container.Controls.Add(new LiteralControl("<br />"));
    }
}
static void Button_DataBinding(object sender, System.EventArgs e)
{
    Button button = (Button)sender;
    RepeaterItem repeaterItem = (RepeaterItem)button.NamingContainer;
    button.ID = "button" + (repeaterItem.DataItem as Choice).id.ToString();
    button.CommandArgument = (repeaterItem.DataItem as Choice).id.ToString();
    button.Text = (repeaterItem.DataItem as Choice).description;
}
void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        List<Choice> choiceList = new List<Choice>();
        // ... code to fill the list ...
        Repeater1.ItemTemplate = new MyButtonTemplate();
        Repeater1.DataSource = choiceList;
        Repeater1.DataBind();
    }
}
void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    int idx = int.Parse( e.CommandArgument.ToString() );
    // this function is NOT called
}

显示按钮,但未触发事件。

我已经尝试在 MyButtonTemplate 中保存一个委托并分配按钮单击事件 - 它不起作用。

谢谢你!

4

0 回答 0