gpt4 book ai didi

asp.net - 必须在 asp.net 中单击按钮两次(在自动回发文本框之后)

转载 作者:行者123 更新时间:2023-12-04 02:21:51 26 4
gpt4 key购买 nike

在一个页面上,我有:

<asp:TextBox runat="server" ID="EmailTextBox" AutoPostBack="true" OnTextChanged="EmailTextBox_Changed" />
<asp:Button runat="server" ID="SearchButton" OnClick="AddButton_Click" Text="add" />

在 EmailTextBox_Changed 中,它会在运行搜索之前计算可以找到的电子邮件数量。

问题是,当您在 EmailTextBox 中键入内容并单击按钮时,您必须单击两次才能显示实际结果。这是因为第一次单击是从文本框中执行“AutoPostBack”部分,然后您必须再次单击以使实际的单击回发发生。

如果不删除“AutoPostBack=true”,在这些情况下如何停止它需要两次点击?

最佳答案

我也在寻找这个问题的答案。我最终删除了所有 autopostback=true 并使用 JavaScript 执行所有操作,与您一样。

然而,我在 JavaScript 之前尝试过的一件事是在回发后保持控制焦点。我注意到我用来存储具有最后一个焦点的控件名称的隐藏字段 DID 具有搜索按钮的名称(我的是一个保存按钮)。所以,虽然我仍然不确定如何让“搜索”功能像它应该的那样“自动”触发,这基本上是将来自文本框和按钮的回发事件一个接一个地链接在一起,我可以知道用户在回发发生(或尝试)之前单击了该保存按钮。

因此,您在回发时所拥有的是文本框事件触发,然后是 Page_Load 方法,或者您想要使用的任何页面循环方法,您可以在其中查看最后一个获得焦点的控件是什么。有了这个,有几种方法可以实现变通。

顺便说一句,您可以在从控件自动回发触发的每个事件中添加代码,如文本框和搜索按钮,以检查焦点控件的名称。如果最后获得焦点的控件不是我们正在运行的控件的自动回发功能,我们可以将名为“Run_Controls_Method”的页面级 bool 值设置为 TRUE,否则,将其设置为 false。这样我们就知道我们应该运行具有最后一个焦点回发方法的控件。

在页面加载时,您可以执行以下操作:

if (Run_Controls_Method && hdfFocusControl.Value != "")
{
switch(hdfFocusControl.Value)
{
case "btnSearch":
btnSearch_OnClick(null, null);
break;
case etc.
}
}

我实现 hdfHasFocus 的方式是:

HTML:
<input id="hdfHasFocus" runat="server" type="hidden" />

后面的 HTML 代码:
protected void Page_PreRender(object sender,EventArgs e)
{
if (IsPostBack != true)
{
//Add the OnFocus event to all appropriate controls on the panel1 panel.
ControlManager.AddOnFocus(this.Controls,hdfHasFocus,true);
//other code...
}

ControlManager.SetFocus(this.Controls,hdfHasFocus.Value,true);
}

ControlManager.cs 相关代码:
        /// <summary>
/// Adds the onfocus event to the UI controls on the controls in the passed in control list.
/// </summary>
/// <param name="controls">The list of controls to apply this event.</param>
/// <param name="saveControl">The control whose .value will be set to the control.ID of the control which had focus before postback.</param>
/// <param name="Recurse">Should this method apply onfocus recursively to all child controls?</param>
public static void AddOnFocus(ControlCollection controls, Control saveControl, bool Recurse)
{
foreach (Control control in controls)
{
//To make the .Add a bit easier to see/read.
string action = "";

//Only apply this change to valid control types.
if ((control is Button) ||
(control is DropDownList) ||
(control is ListBox) ||
(control is TextBox) ||
(control is RadDateInput) ||
(control is RadDatePicker) ||
(control is RadNumericTextBox))
{
//This version ignores errors. This results in a 'worse case' scenario of having the hdfHasFocus field not getting a
// value but also avoids bothering the user with an error. So the user would call with a tweak request instead of
// and error complaint.
action = "try{document.getElementById(\"" + saveControl.ClientID + "\").value=\"" + control.ClientID + "\"} catch(e) {}";

//Now, add the 'onfocus' attribute and the built action string.
(control as WebControl).Attributes.Add("onfocus", action);
}

//The 'onfocus' event doesn't seem to work for checkbox...use below.
if (control is CheckBox)
{
//This version ignores errors. This results in a 'worse case' scenario of having the hdfHasFocus field not getting a
// value but also avoids bothering the user with an error. So the user would call with a tweak request instead of
// and error complaint.
action = "try{document.getElementById(\"" + saveControl.ClientID + "\").value=\"" + control.ClientID + "\"} catch(e) {}";
//In case there is already an attribute here for 'onclick' then we will simply try to add to it.
action = action + (control as WebControl).Attributes["onclick"];

//Now, add the event attribute and the built action string.
(control as WebControl).Attributes.Add("onclick", action);
}

//You don't seem to be able to easily work the calendar button wiht the keyboard, and it seems made for
// mouse interaction, so lets set the tab index to -1 to avoid focus with tab.
if (control is CalendarPopupButton)
{
(control as WebControl).Attributes.Add("tabindex", "-1");
}

//We also want to avoid user tab to the up and down spinner buttons on any RadNumericTextBox controls.
if (control is RadNumericTextBox)
{
(control as RadNumericTextBox).ButtonDownContainer.Attributes.Add("tabindex", "-1");
(control as RadNumericTextBox).ButtonUpContainer.Attributes.Add("tabindex", "-1");
}

//Recursively call this method if the control in question has children controls and we are told to recurse.
if ((Recurse) && (control.HasControls()))
{
AddOnFocus(control.Controls, saveControl, Recurse);
}
}
}

/// <summary>
/// Searches the ControlCollection passed in for a match on the ID name string passed in and sets focus on that control if it is found.
/// </summary>
/// <param name="controls">The collection of controls to search.</param>
/// <param name="FocusToID">The ID of the control to set focus on.</param>
/// <param name="recurse">Recursively search sub-controls in the passed in control collection?</param>
/// <returns>True means keep processing the control list. False means stop processing the control list.</returns>
public static bool SetFocus(ControlCollection controls, string FocusToID, bool recurse)
{
//Return if no control ID to work with.
if (string.IsNullOrEmpty(FocusToID) == true)
{ return false; }

//If we get here and don't have controls, return and continue the other controls if applicable.
if (controls.Count <= 0)
{ return true; }

foreach (Control control in controls)
{
//If this is the control we need AND it is Enabled, set focus on it.
if (((control is GridTableRow) != true) && //GridTableRow.ClientID throws an error. We don't set focus on a 'Row' anyway.
(control.ClientID == FocusToID) &&
((control as WebControl).Enabled))
{
control.Focus();
//return to caller. If we were recursing then we can stop now.
return false;
}
else
{
//Otherwise, see if this control has children controls to process, if we are told to recurse.
if ((recurse) && (control.HasControls()))
{
bool _continue = SetFocus(control.Controls, FocusToID, recurse);
//If the recursive call sends back false, that means stop.
if (_continue != true)
{ return _continue; }
}
}
}

//We are done processing all the controls in the list we were given...
// If we get here, then return True to the caller. If this was a recursive call, then
// the SetFocus in the call stack above will be told to continue looking since we
// didn't find the control in question in the list we were given.
return true;
}

关于asp.net - 必须在 asp.net 中单击按钮两次(在自动回发文本框之后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3189034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com