2013-03-20 62 views
0

我的问题是,我在动态创建的cell.its工作正常,但动态链接按钮的点击事件处理程序不创建动态链接按钮。已经在互联网上搜索了足够的东西,但没有什么工作......在页面加载中调用一种方法,然后调用创建动态单元格和链接按钮的方法。但仍然点击事件不会触发...即使oninit不会工作,因为我的项目的结构是这样的。有没有其他的解决方案this.im调用页面加载方法做一些工作,并调用此创建方法。动态链接按钮(创建在动态表格单元格)事件不会触发

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

回答

3

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

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

这是可能的,你是不是总是产生相同的控制,而他们得到的不同基于此的ID。当第一次渲染按钮和发生PostBack时,您需要确保ID不会有所不同。为此,请在服务器端设置按钮及其父母的ID。


如何ASP.NET事件工作

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

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

  1. 页面请求 - 在这个阶段没有被创建页面,只有从客户端请求已收到。
  2. 开始 - 进行页面的基本预处理。检查是否要求回复或不回复。
  3. 初始化 - 控制已经在这一点上被创建,但视图状态和后回到数据尚未处理尚未
  4. 负载 - 控制信息从视图状态恢复和控制状态
  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); 
} 

在这里,我们动态地添加控制和附加的事件处理程序。下面是请求的数据怎么说用户发送长相当页第一次呈现,如: Request data on first run

当用户点击LinkButton,页面再次处理,用户发送的附加信息的页面,看看需要做什么: Request data after LinkButton is clicked 用户浏览器在__EVENTTARGET密钥下发送表单数据中的控制ID。服务器检查是否设置了__EVENTTARGET,并且它是否知道需要处理事件。这发生在从上面的阶段5。服务器查找控件并触发它是默认事件(如果是LinkButtonButton,则为Click)。

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


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

+0

我试过你说的Nikola.but它仍然没有工作。我已经设置了每个链接按钮的id,像this.lnk.ID = i.tostring()+ j.tostring(); ..现在它为每个链接按钮采取diffidid ..但它仍然没有触发事件。 – DividesByZero 2013-03-20 09:53:28

+0

当你点击按钮时,你检查了什么回传吗?首次创建时控件的ID是什么,当用户点击它并创建页面回复后创建它时,它是什么ID? – 2013-03-20 09:56:20

+0

是的,我正在检查ids.all ids是不同的.prob是它没有处理链接按钮event.the页面回来一旦linkbutton被点击和所有控制vanishes.im真的坚持在这 – DividesByZero 2013-03-20 11:16:11