【问题标题】:C# code jumps to uncalled function upon completion of another function in asp .NET在 asp .NET 中完成另一个函数后,C# 代码跳转到未调用的函数
【发布时间】:2016-11-09 10:24:57
【问题描述】:

背景:

我的网页中有一个位置,用户可以在其中提交 ID 号。他们可以将 ID 输入到文本框中,也可以从下拉列表中选择一个经常使用的 ID。由于这两个输入源本质上做同样的事情,所以我对它们都使用相同的回调函数。此函数中有检查以查看发件人是文本框还是下拉列表(以及适当的验证检查)。

问题:

我从这个函数中得到了一些非常奇怪的行为。当调用此函数并且发送者是下拉列表时,一切都按预期进行。但是,当调用此函数并且发送者是文本框时,一切似乎都很好,直到退出该函数。一旦函数退出,控制立即跳转到另一个我没有在该函数内任何地方调用过的不相关函数。当我测试它和在调试器中时,它会在 Web 上实现这种跳转。它总是跳转到同一个函数。此函数本身是页面上其他位置的按钮的回调函数(仅在用户显式按下按钮时调用)。

我不知道它为什么会这样做,也无法弄清楚出了什么问题。

相关代码

注意:文本框和下拉列表都在 GridView 的 EditItemTemplate 中,如果这很重要的话。

<asp:TextBox ID="TextBoxCQ" runat="server" BackColor="#ffcccc" Text="Enter CQ here" onclick="$(this).val('');" OnTextChanged="cq_Selected_In_Edit"></asp:TextBox>
<asp:DropDownList ID="AssociatedCQList" runat="server" BackColor="#ffcccc" AppendDataBoundItems="True" Font-Size="Smaller" AutoPostBack="True" DataSourceID="SqlDataSource_CQList" DataTextField="cqdetail" DataValueField="cqID" OnSelectedIndexChanged="cq_Selected_In_Edit">
                    <asp:ListItem Selected="True" Enabled="true" Value="Select from list of CQ's">Select from list of CQ's </asp:ListItem>
                </asp:DropDownList>

代码背后:

    protected void cq_Selected_In_Edit(object sender, EventArgs e)
    {
        object type = sender.GetType();
        string name = ((System.Reflection.MemberInfo)(type)).Name;
        bool isTextbox = (name == "TextBox"); // to be used throughout the function
        GridViewRow Row;
        string text;
        if (isTextbox) // it's the textbox calling
        {
            Row = (GridViewRow)((System.Web.UI.WebControls.TextBox)(sender)).NamingContainer;
            text = ((System.Web.UI.WebControls.TextBox)(sender)).Text;
        }
        else // it's the dropdown calling
        {
            Row = (GridViewRow)((System.Web.UI.WebControls.DropDownList)(sender)).NamingContainer;
            text = ((System.Web.UI.WebControls.ListControl)(sender)).Text;
        }
        // do more processing, etc etc
    }

【问题讨论】:

  • 如果没有看到相关代码,我们无法为您提供帮助,请编辑问题。
  • 页面上有多少个按钮,文本框回调是如何触发的?
  • 来自How To: Respond to Changes in a TextBox Web Server Control - "默认情况下,TextChanged 事件不会立即导致 Web 表单页面被发布到服务器。相反,该事件会在下次表单发布时在服务器代码中引发已发布。" 通过观察,您的代码没有在文本框控件上使用 AutoPostback,这意味着 其他东西 导致表单被发布。我的假设是(无论您是否打算这样做)该按钮被调用。
  • @Damien_The_Unbeliever 在网格中,有 4 列的链接按钮,每页有 20 行。所以页面上有 80 个链接按钮,但那里只有 4 个不同的功能。然后页面上有一个“重置”页面的按钮(因为链接按钮通过各种事物过滤条目),这就是神秘的调用。
  • 链接按钮在 HTML 中呈现为锚标记。您有一个只有一个 (HTML) 按钮的表单,因此如果您在填写文本框后按 Enter 键,则该表单将自动提交,并按下唯一可能的按钮。

标签: c# asp.net


【解决方案1】:

控件的IDTextBoxQC,您将其与TextBox 进行比较以找到正确的对象。由于 2 个字符串不相等,因此计算结果为 false。

由于您想在整个过程中使用代码,请将其更改为

bool isTextbox = (name.Contains("TextBox"));

正如函数所暗示的,它正在检查字符串是否包含文本TextBox

【讨论】:

  • 这不正确,我的布尔值正确评估。我得到的是调用控件的名称(即它实际上是什么),而不是控件的 ID。
【解决方案2】:

我仍然不知道究竟是什么导致,尽管这似乎与文本框具有想要按下按钮的亲和力这一事实有关。

解决这个问题的方法是将文本框放在面板中,然后让面板按下一个不可见的按钮,该按钮调用代码隐藏函数(当然,后面的代码也需要稍作修改)。一个简单的实现如下所示:

<asp:Panel runat="server" DefaultButton="btnSearch">
    <asp:TextBox id="txtSearch" runat="server" />
    <asp:Button id="btnSearch" runat="server" text="Start search" />
</asp:Panel>

代码来源:How can I fire a Button Click event when Enter Key is pressed based on what textbox has focus?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2023-03-15
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多