处理动态生成的 .NET 用户控件的事件

本文关键字:用户 控件 事件 NET 处理 动态 | 更新日期: 2023-09-27 18:31:34

我正在处理一个接受扫描输入文本框的页面。 将输入输入到文本框中后,将通过自动回发动态生成包含输入项的其他字段的用户控件。 用户控件还包含一个链接按钮,该按钮旨在删除项(本身)。 单击此按钮会生成一个"删除"事件,该事件应该冒泡到父级。

不幸的是,这似乎没有发生 - 从未达到删除处理代码。 我的理解是,这是因为控件尚未在页面加载时生成,因此尚未创建事件处理程序。 但是由于我不知道在页面加载时需要生成哪些控件(因为尚未处理用户输入),因此我无法将生成用户控件的代码移动到PageLoad。

应该如何处理? 我这样做的方式是错误的吗?我的大部分相关代码都在下面。

感谢您的任何帮助!

页.aspx:

Enter SKU (tab to enter): 
<asp:TextBox ID="EntryTextBox" CssClass="textbox" AutoPostBack="true" OnTextChanged="newItem" runat="server"></asp:TextBox>
<asp:Panel ID="itempanel" runat="server">
</asp:Panel>

页.aspx.cs:

protected void newItem(object sender, EventArgs e)
{
    // we need to store item entries in ViewState so they comeback on postback;
    // they can't be stored in the controls themselves as the controls will
    // disappear
    ViewState["skus"] += "'t" + EntryTextBox.Text;
    ViewState["descs"] += "'t" + itemLookup(EntryTextBox.Text);
    // ...more item descriptors...
    updateItemPanel();
}
protected void updateItemPanel()
{
    // generate a control for each item entered in ViewState
    itempanel.Controls.Clear();
    List<string> skus = new List<string>(ViewState["items"].ToString().Substring(1).Split(''t'));
    List<string> descs = new List<string>(ViewState["descs"].ToString().Substring(1).Split(''t'));
    // ...more item descriptors...
    int i = 0;
    foreach (string sku in skus)
        {
            item newitemctrl = (item)Page.LoadControl("~/item.ascx");
            newitemctrl.line = (i + 1).ToString();
            newitemctrl.sku = skus[i];
            newitemctrl.description = descs[i];
            // ...more item descriptors...
            newitemctrl.deleteLinkClicked += new EventHandler(deleteClicked);
            itempanel.Controls.Add(newitemctrl);
            i++;
        }
    }
    protected void deleteClicked(object sender, EventArgs e)
    {
        List<string> skus = new List<string>(ViewState["skus"].ToString().Substring(1).Split(''t'));
        List<string> descs = new List<string>(ViewState["descs"].ToString().Substring(1).Split(''t'));
        // ...more item descriptors...
        item olditemctrl = (item)sender;
        skus.RemoveAt(Convert.ToInt32(olditemctrl.number) - 1);
        descs.RemoveAt(Convert.ToInt32(olditemctrl.number) - 1);
        ViewState["skus"] = skus.ToString();
        ViewState["descs"] = descs.ToString();
        updateItemPanel();
    }

item.ascx:

<asp:LinkButton ID="DeleteLinkButton" runat="server" onclick="DeleteLinkButton_Click">Delete</asp:LinkButton>

item.ascx.cs:

    public event EventHandler deleteLinkClicked;
    protected void DeleteLinkButton_Click(object sender, EventArgs e)
    {
        if (this.deleteLinkClicked != null)
        {
            this.deleteLinkClicked(new object(), new EventArgs());
        }
    }

处理动态生成的 .NET 用户控件的事件

您可以通过将其添加为 onclick 事件来在 javascript 中调度回发事件:

__doPostBack("<%= button.ClientID %>", "");

DoPostBack 有两个参数,第一个是 ID,第二个是事件名称。我成功地使用了这个解决方案。

您可以在此处找到更多信息。

注意:这本身不会自动触发事件,但您可以在页面的加载事件中看到您想要发生的情况。你可以得到这样的参数::Request.Form["__EVENTTARGET"]您可以完全访问表单数据,因此还可以从动态创建的控件中获取值