我正在处理一个接受扫描输入到文本框中的页面。输入输入到文本框后,将通过自动后备动态生成包含输入项的其他字段的用户控件。用户控件还包含一个用于删除项目(本身)的链接按钮。单击此按钮会生成一个“删除”事件,该事件应该冒泡到父级。
不幸的是,这似乎没有发生 - 永远不会达到删除处理代码。我的理解是,这是因为在页面加载时尚未生成控件,因此尚未创建事件处理程序。但由于我不知道在页面加载时需要生成哪些控件(因为尚未处理用户输入),我无法移动代码来为PageLoad生成用户控件。
应如何处理?我是以错误的方式来做这件事的吗?我的大多数相关代码都在下面。
感谢您的帮助!
page.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>
page.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());
}
}
答案 0 :(得分:2)
您可以通过将其添加为onclick事件来在javascript中发送回发事件:
__doPostBack("<%= button.ClientID %>", "");
DoPostBack有两个参数,第一个是ID,第二个是事件名称。 我成功地使用了这个解决方案。
您可以找到更多信息here。
注意: 这本身并不会自动触发事件,但您可以在页面的“加载事件”中看到您想要发生的事情。 你可以得到这样的参数:: Request.Form [“__ EVENTTARGET”] 您可以完全访问表单数据,因此您还可以从动态创建的控件中获取值