UpdatePanel中的按钮需要两次点击才能触发

时间:2009-10-07 15:21:25

标签: asp.net ajax events button updatepanel

我正在使用VB.NET和Webforms与MS AJAX。

我在MS AJAX更新面板中有一个按钮。加载页面时,按钮的可见性以声明方式设置为“false”。

用户选中一个复选框(也在UpdatePanel中)后,我将按钮的可见性设置为true,它会按预期显示。

然而,用户必须两次点击该按钮才能发生任何事情。第一次点击只是将焦点放在按钮上。需要再次单击才能使回发发生(通过视觉和断点验证)

知道为什么会这样吗?

非常感谢!

安东尼

4 个答案:

答案 0 :(得分:4)

您是否在页面上有动态显示验证器?

如果显示验证器并且您在按钮上按下鼠标,则验证器可以从鼠标下方按下按钮,因此当您抬起手指时实际上不会触发点击事件。

如果是这种情况,您可以通过将验证程序的显示属性设置为静态来解决此问题。

其他想法:

按钮的客户端是否有任何javascript运行onclick,onmousedown,onmouseup?

您是否动态地将此按钮添加到页面?

您是否将CheckBox的{​​{1}}媒体资源设为AutoPostBackTrue?如果设置为true,则在单击按钮时可能处于异步回发的中间。

答案 1 :(得分:0)

我在IE6和Firefox 3.5中对此进行了测试,它对我来说很好用。你的配置有所不同吗?

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="True" OnCheckedChanged="CheckBox1_CheckedChanged" Text="Checkbox" />
        <asp:Button ID="Button1" runat="server" Text="Button" Visible="False" OnClick="Button1_Click" />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </ContentTemplate>
</asp:UpdatePanel>

protected void CheckBox1_CheckedChanged( object sender, EventArgs e )
{
    Button1.Visible = CheckBox1.Checked;
}

protected void Button1_Click( object sender, EventArgs e )
{
    Label1.Text = DateTime.Now.ToString();
}

答案 2 :(得分:0)

狂野猜测:您是否检查了页面的Init或Load阶段中复选框的值?由于页面循环,复选框控件将不会设置其重新发布的值,并且将显示为未选中。只有在第二个回发中,您的代码才会正确地看到已检查状态(从视图状态加载)并显示该按钮。

在复选框中更改事件或在PreRender中设置可见性。

答案 3 :(得分:0)

感谢您的意见。

我在UpdatePanel中有一个3rd Party File Upload control和按钮,这似乎与按钮冲突。

我已经使用javascript解决了这个问题。我在页面顶部附近添加了以下方法:

<script language="javascript" type="text/javascript">
    function DisplayImportButton() {
        document.getElementById('<%= btnImport.ClientId %>').style.visibility = "visible";
    }
</script>

我将以下内容添加到页面底部,因此按钮始终隐藏在开头:

<script language="javascript" type="text/javascript">
    var elem;

    elem = document.getElementById('<%= btnImport.ClientId %>');

    if (elem) {        
        elem.style.visibility = "hidden";
    }
</script>

在更改复选框已检查状态的处理程序中,我添加了:

ScriptManager.RegisterClientScriptBlock(Me, GetType(Page), "ImportButtonScript", _
        "DisplayImportButton();", True)

亲切的问候