LinkBut​​ton回发但未点击事件

时间:2013-05-13 12:43:37

标签: c# .net linkbutton

大家好祝这是我在stackoverflow上的第一篇文章(顺便说一句,这是我最喜欢的网站,用于寻找答案)。在最终承认失败之后,我希望有人可以帮我解决这个问题...

已经多次提出这个问题,但我找到的建议解决方案都没有帮助。提前为一篇冗长的帖子道歉,但我想避免任何人浪费时间建议我已经尝试过的事情。

下面的代码直到最近才开始工作,因为它的结构没有被触及(尽管对子页面进行了无关的更改)。无论如何,它突然停止了工作。现在,即使最简化的按钮也不会触发。

设置

  • VS 2008 C#,IIS 7(停止工作前的设置无变化)

  • 嵌套母版页(主要+1个孩子)

  • 在子页面中使用datalist动态加载ucl
    (即MP =>嵌套MP =>子页面=> ucl => datalist => linkbutton)

  • linkbutton click事件也位于ucl


问题

在LB上单击,回发发生正常,但服务器端点击事件永远不会被命中。

代码

页:

var ctrlX = base.LoadControl("~/somedir/someucl.ascx");

=> loads fine



ascx文件(除了按钮之外的所有数据删除):

<asp:DataList ID="dlX" RepeatLayout="Table" runat="server">
<HeaderTemplate></HeaderTemplate>
<ItemTemplate>
    <tr>
        <td>
            <asp:LinkButton ID="btnX" OnClick="btnX_Click" CausesValidation="false" runat="server" />
        </td>
    </tr>               
</ItemTemplate>
<FooterTemplate></FooterTemplate>



代码隐藏:

protected void btnX_Click(object sender, EventArgs e)
{
// do something  
}



尝试过的事情

  • 清洁解决方案
  • 挖掘工作备份并检查代码更改 (发现没有影响结构或用户控制)

  • 设置LinkBut​​ton CausesValidation true / false

  • 将datalist和LinkBut​​ton剥离为基本要素
  • 添加AddressOf =&#34; btnX.click&#34;到LinkBut​​ton
  • 使用不同的设置一次一个地包装UpdatePanel
    用户控件
    数据列表
    链接按钮

  • 在usercontrol init / load事件中重新附加eventhandler:

    IEnumerable<Control> controls = Utils.FlattenChildren(dlX);
    
    foreach (var button in controls.OfType(LinkButton)())
    {
        if (button.ID.Contains("btnX"))
            button.Click += new EventHandler(btnX_Click);
    }
    

    无论我在何处添加上述代码,都会找到所有按钮并附加事件,但点击事件不会触发((LinkBut​​ton)= LinkBut​​ton里面&lt;&gt ;;无法让它显示正确,仍然在编辑中苦苦挣扎)

  • 在页面加载事件中手动添加PostBackUrl

  • 比较加载/回发事件之间的客户端ID =&GT;他们总是匹配



就是这样。现在,我无法想到还有什么可以尝试或检查(也许在回发的断点上下文菜单中有什么东西?)。

因为ucl加载正常,并且回发工作正常,我怀疑问题是在ucl中的某个地方,而不是加载它的子页面。但也许不是。

如果可能的话,我想避免使用变通方法(我需要上面没有显示的按钮命令参数,并且不喜欢使用隐藏字段或查询字符串的jquery等解决方案)。

除了任何事情,我真的很想了解是什么导致了这一点。

显然,我错过了一些东西......感谢任何人花时间阅读/帮助这个!



========按要求添加代码隐藏=======

我已将父页面代码简化为最小化,删除所有方法调用,并根据Eoins建议将ucl加载移动到页面的init事件中。 ucl代码仍然如上所示。 DL和LB显示正常,点击后会触发回发,点击ucl页面加载事件,但和以前一样,服务器点击事件没有被点击。

    protected override void OnInit(EventArgs e)
    {
        var ctrlX = base.LoadControl("~/someucl.ascx");

        if (ctrlX == null)
            return;

        DataList dlX = (DataList)ctrlX.FindControl("dlX");

        if (dlX == null)
            return;

        DummyCollection x = new DummyCollection();

        x.Add(null); // ok since the test LB does not draw on the datasource
        dlX.DataSource = x;
        dlX.DataBind();
        pnlX.Controls.Add(ctrlX);

        base.OnInit(e);
    }

1 个答案:

答案 0 :(得分:2)

var ctrlX = base.LoadControl("~/somedir/someucl.ascx");

这段代码到底在哪里?

您需要确保创建它并在页面生命周期中尽早将其添加到控件集合中,以便在后续回发时创建它并创建它。及时连线。即在oninit事件中。

protected override OnInit(...)
{
   base.OnInit(...);

   var ctrlX = base.LoadControl("~/somedir/someucl.ascx");

   this.Controls.Add(ctrlX);
}