0

我的问题是我在动态创建的单元格中创建动态链接按钮。它工作正常,但动态链接按钮的点击事件处理程序没有触发。我在互联网上搜索了足够多但没有任何结果..我调用了一个方法页面加载又调用创建动态单元格和链接按钮的方法。但是点击事件仍然没有触发......即使oninit也不会工作,因为我的项目结构是这样的。是否有任何其他解决方案可以解决这个问题。我在页面加载时调用一个方法,它会做一些工作,然后调用这个创建方法。

     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.
}
4

1 回答 1

3

根据您粘贴的代码以及您说它是从 Page_Load 或更早的时间调用它的事实,这应该可以工作。您可能省略了一些重要的代码。调试这个

  1. 打开网页
  2. 查看源代码,找到您的按钮并检查它的 ID
  3. 在 Page_Load 中设置断点
  4. 点击按钮
  5. 查看Request.Form并检查按钮 ID 是否从客户端发布

您可能并不总是创建相同的控件,并且它们会基于此获得不同的 ID。您需要确保在首次呈现按钮时和发生 PostBack 时 ID 没有不同。为此,请在服务器端设置按钮的 ID 及其父级。


ASP.NET 事件如何工作

网站是无状态的用户界面。这意味着服务器产生的输出显示给用户并且不再关心它们。为了处理用户的某些工作请求,用户浏览器向服务器发送信息。处理事件也是如此。为了让服务器知道需要处理哪个事件,它必须创建所有控件,然后检查哪个用户发送的数据并查看哪个控件用户针对他的操作。可以理解,有必要尽早创建控件,以便服务器可以查找它们并为它们找到事件处理程序。

页面生命周期有几个阶段。生命周期从用户浏览器向服务器发送请求开始,到服务器输出对该请求的响应时结束。当用户浏览器完全加载页面时,服务器不再知道它。一旦单击将数据发送回服务器的按钮,服务器将再次基于页面创建页面,并且页面将经历另一个生命周期。生命周期阶段是:

  1. 页面请求- 在此阶段没有创建页面,仅收到来自客户端的请求。
  2. 开始- 执行页面的基本预处理。检查请求是否是回发。
  3. 初始化- 此时已创建控件,但尚未处理视图状态和回发数据
  4. Load - 从视图状态和控制状态中恢复控制信息
  5. 回发事件处理- 回发 .... 事件处理
  6. 渲染- 保存视图和控件状态,并Render为每个控件向下调用控件树
  7. 卸载- 请求被丢弃

正如您可能已经猜到的那样,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时,页面被再次处理,用户向页面发送附加信息以查看需要做什么: 点击 LinkBut​​ton 后请求数据 用户浏览器在表单数据中发送控件 ID,在__EVENTTARGETkey 下。服务器检查是否__EVENTTARGET已设置,如果已设置,则它知道需要处理事件。这发生在上面的第 5 阶段。服务器查找控件并触发它的默认事件(Click在 aLinkButton和的情况下Button)。

控件也会发生类似的情况Button点击按钮后请求数据 这一次,控件 ID 作为表单数据的键值发送。在表单数据中,该键下是value代表按钮的 html 元素(在我们的例子中,值test是按钮文本)。


这应该足以了解如何在 ASP.NET 中处理事件的基础知识。现在根据这个,在 中放置一个断点Page_Load,检查Request.Form["__EVENTTARGET"]它是否被设置。如果已设置,请检查您的控件是否已在该点创建,是否具有相同的 ID,以及是否已附加事件处理程序。如果事件仍未触发,那么您要么删除该控件(或其父控件),要么在请求生命周期的第 5 阶段之前分离事件处理程序。

于 2013-03-20T08:54:47.040 回答