我的问题是我在动态创建的单元格中创建动态链接按钮。工作正常,但动态链接按钮的单击事件处理程序没有触发。我已经在互联网上搜索了足够但没有任何工作...页面加载的方法,它又调用创建动态单元格和链接按钮的方法。但仍然没有触发click事件...即使oninit也不会工作,因为我的项目的结构是这样的。还有任何其他解决方案,this.im调用页面加载的方法,它做了一些工作,并调用这个创建方法。 / p>
protected void create()
{
for (int j = 0; j < 8; j++)
{
Label lbl;
LinkButton lnk;
TableRow tRow = new TableRow();
for (int i = 0; i < 6; i++)
{
TableCell tCellLessonPlan = new TableCell();
lbl = new Label();
lnk = new LinkButton();
lnk.Click += new System.EventHandler(this.LinkButton_Click);
lbl.Text = "Period";
lnk.Text = "Details";
tCellLessonPlan = createCell(tCellLessonPlan.Text);
tCellLessonPlan.Controls.Add(lbl);
tCellLessonPlan.Controls.Add(lnk);
tRow.Cells.Add(tCellLessonPlan);
}
Table1.Rows.Add(tRow);
}
}
protected TableCell createCell(string cellText)
{
TableCell tCell = new TableCell();
Unit height = new Unit(20, UnitType.Pixel);
tCell.Height = height;
Unit width = new Unit(190, UnitType.Pixel);
tCell.Width = width;
tCell.BorderStyle = BorderStyle.Solid;
tCell.BorderColor = System.Drawing.Color.Black;
tCell.BorderWidth = Unit.Point(2);
tCell.Text = cellText;
return tCell;
}
protected void LinkButton_Click(object sender, EventArgs e)
{
LinkButton lnk = (LinkButton)sender;
//Some logic here.
}
答案 0 :(得分:3)
从您粘贴的代码和您说它是从Page_Load或更早版本调用的事实应该可以使用。您可能省略了一些重要的代码。要调试这个
Request.Form
并检查是否已从客户端您可能并不总是创建相同的控件,并且基于此可能会获得不同的ID。首次呈现按钮时以及发生PostBack时,您需要确保ID没有不同。为此,请在服务器端设置按钮的ID及其父项。
网站是无状态用户界面。这意味着服务器生成的输出显示给用户,不再关心它们。为了处理用户对某些工作的请求,用户浏览器向服务器发送信息。这也是处理事件的情况。要让服务器知道需要处理哪个事件,它必须创建所有控件,然后检查用户发送的数据,并查看哪个控件用户使用了他的操作。可以理解的是,必须尽早创建控件,以便服务器可以查找它们并为它们查找事件处理程序。
页面生命周期有几个阶段。当用户浏览器向服务器发送请求时,生命周期开始,并在服务器输出对该请求的响应时结束。在用户浏览器已完全加载页面时,服务器不再知道它。一旦点击向服务器发送数据的按钮,服务器再次创建基于页面并且页面经历另一个生命周期。生命周期阶段是:
Render
您可能已经猜到3,4和5对您很重要。您应该在初始化阶段或最新加载阶段创建控件,因为在下一阶段回发事件处理已完成。
服务器如何知道要调用哪个事件处理程序?用户发回所有信息以查找控制事件被触发的人和事件本身。此数据取决于控件类型。
以下代码为例:
protected void Page_Load(object sender, EventArgs e)
{
CreateControls();
}
public void CreateControls()
{
LinkButton linkBtn = new LinkButton();
linkBtn.ID = "btnTest";
linkBtn.Text = "test";
linkBtn.Click += new EventHandler(btn_Click);
pnl.Controls.Add(linkBtn);
Button btn = new Button();
btn.ID = "btnTest2";
btn.Text = "test";
btn.Click += new EventHandler(btn_Click);
pnl.Controls.Add(btn);
}
在这里,我们动态添加控件并附加事件处理程序。以下是首次呈现页面时用户发送的请求数据的方式:
当用户点击LinkButton
时,会再次处理页面,并且用户会向页面发送其他信息以查看需要执行的操作:
用户浏览器在__EVENTTARGET
键下的表单数据中发送控件ID。服务器检查是否设置了__EVENTTARGET
,如果是,则知道需要处理事件。这发生在上面的第5阶段。服务器查找控件并触发它的默认事件(如果是Click
和LinkButton
,则Button
。)
Button
控制发生类似的事情:
这次,控制ID被发送作为表单数据的键值。在表单数据中,该键下面是html元素的value
,表示按钮(在我们的例子中,值为test
,因为这是按钮文本)。
这应该足以理解ASP.NET中如何处理事件的基础知识。现在根据这个,在Page_Load
中放置一个断点,检查Request.Form["__EVENTTARGET"]
并查看它是否已设置。如果已设置,请检查您的控件是否已在该点创建,是否具有相同的ID,以及是否已附加事件处理程序。如果事件仍未被触发,那么您要么删除该控件(或它的父级),要么在请求生命周期的第5阶段之前分离事件处理程序。