ASP.NET用户控件上的链接按钮未触发

时间:2010-02-06 10:21:55

标签: asp.net user-controls linkbutton event-handling

我有一个用户控件,它被添加到另一个用户控件中。嵌套的用户控件由GridView,图像按钮和链接按钮构成。嵌套的用户控件根据绑定到GridView的结果作为集合对象添加到外部控件。

我遇到的问题是我的链接按钮不起作用。我点击它,事件不会触发。甚至没有达到断点。由于嵌套用户控件被添加了很多次,我将图像按钮设置为具有唯一ID以及链接按钮。虽然图像按钮可以正常使用JavaScript。链接按钮需要在后面的代码中触发事件,但尽管我付出了很多努力,但我无法使其工作。我动态地将链接按钮添加到控件。以下是我正在使用的相关代码:

public partial class ucCustomerDetails : System.Web.UI.UserControl
{
public event EventHandler ViewAllClicked;

protected override void CreateChildControls( )
{
   base.CreateChildControls( );

   string strUniqueID = lnkShowAllCust.UniqueID;
   strUniqueID = strUniqueID.Replace('$','_');
   this.lnkShowAllCust.ID = strUniqueID;
   this.lnkShowAllCust.Click += new EventHandler(this.lnkShowAllCust_Click);
   this.Controls.Add(lnkShowAllCust);
}

protected override void OnInit (EventArgs e)
{
   CreateChildControls( );
   base.OnInit(e);
}

protected override void OnLoad(EventArgs e)
{
   base.EnsureChildControls( );
}

protected void Page_Load(object sender, EventArgs e)
{
   if (IsPostBack)
   {
   CreateChildControls( );
   }
}

protected void lnkShowAllCust_Click(object sender, EventArgs e)
{
   this.OnCustShowAllClicked(new EventArgs ( ));
}

protected virtual void OnCustShowAllClicked(EventArgs args)
{
   if (this.ViewAllClicked != null)
   {
      this.ViewAllClicked(this, args);
   }
}    
}

过去3天我一直在处理这个问题并且没有成功,我确实需要一些帮助。

有人可以帮助我吗?

5 个答案:

答案 0 :(得分:2)

我的LinkBut​​ton没有触发它的Click事件,原因是我将其CausesValidation属性设置为True。如果您不希望链接验证表单,请务必将其设置为False。

答案 1 :(得分:1)

尝试将您的点击事件添加到linkbutton标记:

<asp:LinkButton runat="server" OnClick="linkShowAllCust_Click" />

或将其添加到您的Page_Load:

Page_Load(object sender, EventArgs e) 
{
  this.lnkShowAllCust.Click += new EventHandler(this.lnkShowAllCust_Click);
}

答案 2 :(得分:0)

gridview中的usercontrol?如果是,则在gridview的onrowcreated事件上注册事件处理程序。

答案 3 :(得分:0)

您似乎有一个viewstate问题。因为在加载视图状态时控件不存在,所以应用程序不知道如何挂接要触发的事件。以下是解决此问题的方法。

通过在loadviewstateevent被触发后立即加载控制树,您实际上可以使您的应用正常工作。如果你覆盖loadviewstate事件,调用mybase.loadviewstate,然后把你自己的代码重新生成后面的控件,这些控件的值将在页面加载时可用。在我的一个应用程序中,我使用viewstate字段来保存可用于重新创建这些控件的ID或数组信息。

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub

答案 4 :(得分:0)

我有同样的问题。我在添加控件的页面上有viewstate =“false”。 (在aspx页面上)