【问题标题】:MasterPage button click event doesn't fire on the first click but on the second clickMasterPage 按钮单击事件不会在第一次单击时触发,而是在第二次单击时触发
【发布时间】:2013-02-19 19:37:48
【问题描述】:

您好,提前感谢您的帮助。 这是我的问题:

  • 我的网页分为 MasterPage 和 Main Page。
  • 任何一个页面中的任何内容都不是动态设置的(没有代码隐藏),它们都是在 .aspx 页面上设置的。
  • 在 MasterPage 我有一个“保存”按钮。
  • 在主页上我有几个文本框。
  • 主页文本框有一个事件 (void SumAll(...)),当焦点离开这些复选框时会触发该事件。
  • 在 MasterPage 上,我有一个连接到“保存”按钮的单击事件。

事情是这样的:

  • 我对主页上的任何一个文本框进行了更改,但焦点没有离开此文本框(没有立即触发 SumAll() 事件)。
  • 然后单击 MasterPage 中的“保存”按钮。

我希望 MasterPage“保存”按钮单击事件会触发,但它永远不会触发! Main Page textchange (SumAll()) 事件会触发,但 MasterPage click 事件不会。

如果我再次单击 MasterPage“保存”按钮,MasterPage click 事件会成功触发,但当然不会触发 Main Page textchanged 事件。当我只单击 MasterPage 的“保存”按钮而不在主页上进行任何更改时也是如此。

这是我的代码示例。 主页 textchanged 事件:

protected void SumTheAmounts(object sender, EventArgs e)
    {
        Decimal lease = 0.00M;
        Decimal securityDeposit = 0.00M;
        Decimal miscellanious = 0.00M;
        Decimal sumTotal = 0.00M;

        Decimal.TryParse(txtMiscellaneousAmount.Text, out miscellanious);
        Decimal.TryParse(txtSecurityDepositAmount.Text, out securityDeposit);
        Decimal.TryParse(txtLeaseAmount.Text, out lease);

        sumTotal = miscellanious + securityDeposit + lease;
        txtAmount.Text = sumTotal.ToString();

        // Set focus to the next textbox
        TextBox tb = (TextBox)sender;
        switch (tb.ID)
        {
            case "txtLeaseAmount":
                txtSecurityDepositAmount.Focus();
                break;
            case "txtSecurityDepositAmount":
                txtMiscellaneousAmount.Focus();
                break;
            case "txtMiscellaneousAmount":
                txtMiscellaneousAmount.Focus(); // Send back to the same. .
                break;
            default:
                break;
        }
    }

还有我的 MasterPage 的“保存”按钮点击事件:

    protected void btnSave_Click(object sender, EventArgs e)
    {
        // Save every little thing...
        switch (ContentPageLoaded)
        {
            case "CheckRequest":
                ((CheckRequest)ContentMain.Page).UpdateMe();
                break;
            case "PicturesLoad":
                ((PicturesLoad)ContentMain.Page).UpdateMe();
                break;
            default:
                break;
        }
    }

标记:

<asp:Panel ID="pnlSave" CssClass="ButtonClass" runat="server">
   <asp:Button ID="btnSave" style="width:160px; font-size:small; position:relative; color:Blue; top: 0px; left: 0px;" runat="server" Text="Save" onclick="btnSave_Click" CausesValidation="False" /> 
</asp:Panel>

页面加载:

if (!IsPostBack) 
{ 
   Button saveButton = (Button)Master.FindControl("btnSave"); 
   branchName = (string)Session["BranchName"]; 
   branchLegalData = new Classes.BranchLegalData(); 
   if ((branchName != null) && (branchName.Length > 0)) 
   { 
      FillThisPageData(); 
   } 
} 
else { } 
Master.ContentPageLoaded = "CheckRequest"; 

非常感谢任何帮助! 谢谢

【问题讨论】:

  • 您能告诉我们主页上保存按钮的标记吗?我们还可以查看您在 page_load 中为任一页面提供的任何代码吗?
  • MasterPage 的 page_load 仅启用 MasterPage 上的按钮,因此它不重要。保存按钮始终处于启用状态。
  • 请将您的代码放在原始问题中,而不是 cmets。这次我为你做了。
  • 为什么你的页面加载中有这行:Button saveButton = (Button)Master.FindControl("btnSave");,你在用saveButton做什么?
  • 我访问 MasterPage 保存按钮是因为(取决于保存/未保存状态)我将按钮文本从“保存”更改为“更新”

标签: c# asp.net events


【解决方案1】:

这是在黑暗中拍摄的,但请尝试为所有文本框设置 autopostback="false"。我怀疑可能发生的情况是,当您将注意力集中在文本框上然后一口气单击按钮时,您正在触发两次回发。

只有在您将自动回发设置为 true 时才会发生这种情况。

【讨论】:

    【解决方案2】:

    谢谢大家!

    在文本框上设置 autopostback="false" 有效! 我认为发生的事情是,使用 autopostback="true" 文本框会触发它自己的文本更改事件,并且由于某种原因,MasterPage 按钮单击事件在那之后不会触发?! 有人可以告诉我为什么文本框事件会触发而不是按钮事件吗???

    无论如何,这个问题已经得到解决,我感谢所有的意见......你们摇滚!

    史蒂夫

    【讨论】:

    • 很高兴它成功了。如果您觉得我的回答解决了您的问题,请随时点击我回答左上角的复选框接受它。您看到此行为的原因是因为您一次只能回复一个帖子。你试图做两个,但第二个没有成功。
    猜你喜欢
    • 1970-01-01
    • 2018-03-09
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多