动态链接按钮(在动态表格单元格中创建)事件未触发

时间:2013-03-20 07:23:24

标签: asp.net

我的问题是我在动态创建的单元格中创建动态链接按钮。工作正常,但动态链接按钮的单击事件处理程序没有触发。我已经在互联网上搜索了足够但没有任何工作...页面加载的方法,它又调用创建动态单元格和链接按钮的方法。但仍然没有触发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.
}

1 个答案:

答案 0 :(得分:3)

从您粘贴的代码和您说它是从Page_Load或更早版本调用的事实应该可以使用。您可能省略了一些重要的代码。要调试这个

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

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


    ASP.NET事件如何工作

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

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

    1. 页面请求 - 此阶段尚未创建页面,仅收到客户端的请求。
    2. 开始 - 执行页面的基本预处理。检查请求是否回复。
    3. 初始化 - 此时已创建控件,但尚未处理查看状态和回发数据
    4. 加载 - 从视图状态和控制状态恢复控制信息
    5. 回发事件处理 - 回发....事件处理
    6. 渲染 - 保存查看和控制状态,并为每个控制下调控制树调用Render
    7. 卸载 - 请求被丢弃
    8. 您可能已经猜到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);
      }
      

      在这里,我们动态添加控件并附加事件处理程序。以下是首次呈现页面时用户发送的请求数据的方式: Request data on first run

      当用户点击LinkButton时,会再次处理页面,并且用户会向页面发送其他信息以查看需要执行的操作: Request data after LinkButton is clicked 用户浏览器在__EVENTTARGET键下的表单数据中发送控件ID。服务器检查是否设置了__EVENTTARGET,如果是,则知道需要处理事件。这发生在上面的第5阶段。服务器查找控件并触发它的默认事件(如果是ClickLinkButton,则Button。)

      Button控制发生类似的事情: Request data after Button is clicked 这次,控制ID被发送作为表单数据的键值。在表单数据中,该键下面是html元素的value,表示按钮(在我们的例子中,值为test,因为这是按钮文本)。


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