在执行任何操作之前,需要在控件上单击两次动态创建的链接?

时间:2009-03-09 16:29:28

标签: c# asp.net

我有一个aspx页面,它有一个控件,作为同一页面上GridView的摘要。页面加载时,它会创建摘要控件并动态创建链接并为其附加事件处理程序。这是一个片段:

protected void Page_Load(object sender, EventArgs e)
{  
    LoadSummaries();    
}

LoadSummaries()遍历GridView的DataSet并创建链接。以下是我如何创建链接以及附加和事件处理程序的片段:

LinkButton lb = new LinkButton();
lb.Text = "Dynamic Text goes here";
lb.Click += new System.EventHandler(this.Search);
lb.CommandName = "CommandName";
lb.CommandArgument = "CommandArgument";

当我运行页面时,它会加载一切正常,但我需要单击链接两次才能进入搜索方法。在第一次单击时,页面重新加载,但它不会进入搜索方法。在第二次点击时,它会进入搜索方法。

我很好奇是否因为在第一次点击时,它实际上将事件处理程序绑定到linkbutton,但这发生在Page_Load中,所以当页面加载时,调用LoadSummaries,然后绑定事件到链接按钮,所以我不知道为什么我需要点击它两次。

2 个答案:

答案 0 :(得分:3)

您是否在页面的其他位置使用任何复杂的控件,可能会将控件注入您的页面?

我遇到了这个问题,这些页面具有来自库的某些控件,这些控件将控件注入到页面中。我正在使用Calendar控件执行此操作。发生在我身上的是,当我的代码构建控件时,控件ID看起来都很好,但是在渲染之前,工具包控件注入了新的控件,这意味着我的链接按钮的回发URL用一个标识自己控件ID,但服务器认为它应该具有不同的控件ID。

这导致事件处理程序与第一个帖子后面的控件不匹配,因此事件无法触发。第二次,控件已经被注入,所以我的链接按钮在其回发URL中有新的控件ID,因此事件可能会触发。

解决方案1: 摆脱注入的控制并导致问题。不幸的是,并不总是一个选择。我不能这样做。

解决方案2: 摆脱LinkBut​​ton并使用常规链接。如果您的事件处理程序必须在该页面上,则可能无效。

解决方案3: 提供不会被其他控件更改的ID。 (这是Xaisoft的解决方案)

答案 1 :(得分:2)

杰伊是对的。由于您没有为控件分配任何ID,因此回页中的页面可能会发生变化,这意味着它无法将事件与控件链接。

顺便说一下,理论上不好的做法是不将ID分配给控件,因为如果你改变你的页面布局,它会使任何UI综合测试(例如基于Selenium的测试套件)中断。