天道酬勤,学无止境

回发后将焦点设置在文本框上(Set focus on textbox after postback)

问题

我有一个包含 3 个文本框的搜索页面,用户可以使用它来过滤搜索。

我已将焦点放在包含文本的 TextBox 上。 如果不止一个包含文本,只需关注最后一个 TextBox。

private void SetFocusOnTextBox(ControlCollection ctrlCollection)
{
    foreach (Control ctrl in ctrlCollection)
    {
        if (ctrl.GetType() == typeof(TextBox))
        {
            if (((TextBox)ctrl).Text != string.Empty)
            {
                SetFocus(ctrl);
            }
        }
    }
}

在代码运行和用户搜索后,焦点将转到 TextBox 的开头,而不是假定的结尾。 如何将插入标记在该文本框的末尾?

回答1

我认为答案在这里:使用 JavaScript 将光标置于文本输入元素中的文本末尾。

取自链接的解决方案:您必须将onfocus="this.value = this.value"到标记文件中的三个控件中。 这在 ASP.NET 中并不容易,但一种解决方案是在代码隐藏文件中添加属性。

protected void Page_Init(object sender, EventArgs e)
{
    // MoveCursorToEndOnFocus is called in Page_Init and not Page_Load to avoid
    // filling the ViewState with unnecessary data.
    // TODO: Call MoveCursorToEndOnFocus here.
}

private void MoveCursorToEndOnFocus(ControlCollection controlCollection)
{
    foreach (TextBox textBox in controlCollection
        .Where(control => control.GetType() == typeof(TextBox)))
    {
        textBox.Attributes.Add("onchange", "this.value = this.value");
    }
}
回答2

不应该是

if (((TextBox)ctrl).Text == string.Empty)

前进到最底部的空文本框? 如果是if (((TextBox)ctrl).Text != string.Empty) ,它会将焦点(最终)设置到最底部的非空文本框。

至于将光标移动到最后一个字符,请尝试以下操作:

function cursorToEnd( elem )
{
  elem.focus();
  elem.value+='x';
  elem.value=elem.value.replace(/x$/,"");   
}
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • ASP .NET Button事件处理程序不会在第一次单击时触发,而是在回发后第二次单击时触发(ASP .NET Button event handlers do not fire on the first click, but on the second click after a PostBack)
    问题 背景:我正在自定义现有的ASP .NET / C#应用程序。 它具有自己的小“框架”和约定,供开发人员在扩展/自定义其功能时遵循。 我目前正在扩展它的某些管理功能,该框架向该框架提供了一个合同,以强制执行GetAdministrationInterface()方法的实现,该方法返回System.Web.UI.Control 。 在托管GUI界面的页面的Page_Load()方法期间调用此方法。 问题:我的GUI中有三个按钮,每个按钮都被分配了一个事件处理程序。 我的管理GUI可以很好地加载,但是单击任何按钮都无法完成我期望的操作。 但是,当我第二次单击它们时,这些按钮会起作用。 我在每个事件处理程序方法的开头放置了断点,并逐步执行了我的代码。 第一次单击时,没有触发任何事件处理程序。 第二次点击时,他们开了枪。 有任何想法吗? 按钮定义示例(在GetAdministrationInterface ) public override Control GetAdministrationInterface() { // more code... Button btn = new Button(); btn.Text = "Click Me!"; btn.Click += new EventHandler(Btn_Click); // more code... }
  • asp.net 文本框在回发后不会填充(asp.net textbox doesn't populate after postback)
    问题 我正在使用 ASP.NET 和 C# 几个文本框来计算输入的结果。 Textbox2 输入了一个值,点击按钮 Textbox1 被填充。 这在我第一次输入值时工作正常。 但是第二次更改 Textbox2 中的值时,我看到该值在调试按钮单击时分配给 Textbox1,但没有显示在屏幕上。 我有许多其他控件和一个母版页。 文本框位于更新面板内。 有人可以帮助我这是怎么回事吗? 这是代码: <asp:TextBox ID="Textbox1" runat="server" Width="150px" TabIndex="6" MaxLength="8"></asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator7" runat="server" ControlToValidate="TextBox1" ErrorMessage="*"></asp:RequiredFieldValidator> <asp:TextBox runat="server" ID="Textbox2" Width="150px" Visible="false"></asp:TextBox>&nbsp <asp:ImageButton runat="server" ID="imgCalcAdjRate" ImageUrl="~
  • 回发后将数据保留在GridView中(Keeping Data in GridView after PostBack)
    问题 我有一个与SqlDataSource关联的GridView 。 单击Button ,将更改SelectCommand ,然后使用DataBind更新GridView 。 PostBack之后,我希望保留最新的数据,我不希望原始的SelectCommand加载GridView 。 我知道这是通过称为ViewState的东西完成的,但是我没有以正确的方式实现它。 我在网格本身上尝试了EnableViewState="true"和EnableViewState="false" ,但是没有运气。 代码 <asp:GridView ID="GridView1" ...... DataSourceID="UsersSource" > <asp:SqlDataSource ID="UsersSource" ... SelectCommand="SELECT * FROM USERS"></asp:SqlDataSource> 在启动时, GridView会填充SELECT * FROM USERS的结果。 现在,我单击一个Button ,它将执行以下操作: UsersSource.SelectCommand = "SELECT * FROM USERS WHERE user_id = 1"; GridView1.DataBind(); GridView充满了新的数据。 现在让我们说
  • 动态创建的控件在回发后丢失数据(Dynamically Created Controls losing data after postback)
    问题 实际上,我是在Pageload上创建1个TextBox并将该TextBox添加到Panel 。 现在,我有一个类似Add Another的LinkButton 。 我在该TextBox输入Text,如果需要,我需要通过单击Add Another LinkButton来创建New TextBox 。 实际上,我能够获得计数并重新创建TextBoxes 。 但是问题是,先前生成的Textboxes我输入的文本”丢失了。 有人可以建议我解决这个问题吗? protected void Page_Load(object sender, EventArgs e) { try { if (!IsPostBack) { for (int i = 0; i < 5; i++) { TableRow row = new TableRow(); for (int j = 0; j < 5; j++) { TableCell cell = new TableCell(); TextBox tb = new TextBox(); tb.ID = "TextBoxRow_" + i + "Col_" + j; cell.Controls.Add(tb); row.Cells.Add(cell); } Table1.Rows.Add(row); } } } catch (Exception ex) {
  • 在Asp.net中回发后如何保持label的值? [关闭](How to maintain the value of label after postback in Asp.net? [closed])
    问题 关门了。 这个问题需要细节或明确性。 它当前不接受答案。 想要改善这个问题吗? 添加详细信息,并通过编辑此帖子来澄清问题。 7年前关闭。 改善这个问题 在asp.net页面中,我需要知道如何维护通过html按钮单击分配的特定标签的值。 回发完成后。 详细代码: <table> <tr> <td><asp:Label ID="lbl1" runat="server" ClientIDMode="Static">Before Changing</asp:Label></td> <td><asp:Label id="lbl2" runat="server" ClientIDMode="Static"></asp:Label></td> <td><asp:TextBox ID="txtbox" runat="server"></asp:TextBox></td> </tr> <tr> <td><asp:Button ID="btnasp" runat="server" Text="ASP Button" Height="50px" Width="150px" OnClick="btnasp_Click"/></td> <td><input type="button" id="btnhtml" value="HTML Button" onclick="showlabel()"
  • JQuery 设置文本值在回发后丢失(JQuery set text value is lost after postback)
    问题 <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script src="../js/jquery/jquery-1.4.1.min.js" type="text/javascript"></script> <script> function btnSetText_OnClientClick() { $("#<%= lbl1.ClientID %>").text("123"); } </script> </head> <body> <form id="form1" runat="server"> <div> <asp:Label ID="lbl1" runat="server"></asp:Label> <asp:Button ID="btnSetText" runat="server" Text="Set Text" OnClientClick="btnSetText_OnClientClick(); return false;" /> <asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" /> </div> </form> </body> <
  • 如何在KeyUp上进行文本框回发?(How do I make a Textbox Postback on KeyUp?)
    问题 我有一个文本框,它可以更改OnTextChanged事件中下拉列表的内容。 当文本框失去焦点时,似乎会触发此事件。 如何在按键或按键事件中发生这种情况? 这是我的代码的示例 <asp:TextBox ID="Code" runat="server" AutoPostBack="true" OnTextChanged="Code_TextChanged"> <asp:UpdatePanel ID="Update" runat="server"> <ContentTemplate> <asp:DropDownList runat="server" ID="DateList" /> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="Code" /> </Triggers> </asp:UpdatePanel> 因此,在后面的代码中,我将下拉列表绑定到页面加载上。 Code_TextChanged事件只是重新绑定了下拉菜单。 我希望在每次按键时都发生这种情况,而不是在文本框失去焦点时发生这种情况。 我最近继承了此代码,这对我而言不是理想的方法,但是由于时间限制,我无法使用Web服务方法来重写此代码。 我尝试使用jQuery绑定“ keyup”事件以匹配文本框的“ change”事件
  • 在WPF中将焦点设置在文本框上(Set focus on textbox in WPF)
    问题 如何在WPF中将焦点设置在TextBox元素上 我有以下代码: txtCompanyID.Focusable = true; txtCompanyID.Focus(); ...但是它不起作用。 任何的想法? 回答1 在XAML中: <StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}"> <TextBox Name="Box" /> </StackPanel> 回答2 到目前为止,没有人解释为什么问题中的代码不起作用。 我的猜测是代码被放置在Window的构造函数中。 但是,现在确定焦点还为时过早。 一旦窗口准备好进行交互,就必须完成此操作。 代码的最佳位置是Loaded事件: public KonsoleWindow() { public TestWindow() { InitializeComponent(); Loaded += TestWindow_Loaded; } private void TestWindow_Loaded(object sender, RoutedEventArgs e) { txtCompanyID.Focus(); } } 回答3 尝试FocusManager.SetFocusedElement FocusManager.SetFocusedElement
  • 将焦点设置在XAML WPF中的文本框上(Set the focus on a textbox in xaml wpf)
    问题 尽管在此论坛上有一些帖子,但我找不到其他内容,告诉我如何将重点放在TextBox 。 我有一个带有许多标签和文本框的userControl。 加载表单时,我希望特定的textBox具有焦点。 我已经设置了tabIndex,但是似乎没有用。 有什么建议么? 回答1 为此,可以使用FocusManager.FocusedElement附加属性。 这是一段代码,默认情况下将焦点设置为TxtB。 <StackPanel Orientation="Vertical" FocusManager.FocusedElement="{Binding ElementName=TxtB}"> <TextBox x:Name="TxtA" Text="A" /> <TextBox x:Name="TxtB" Text="B" /> </StackPanel> 如果不想在XAML中执行此操作,也可以在代码隐藏中使用TxtB.Focus() 。 回答2 您可以直接在TextBox上应用此属性: <TextBox Text="{Binding MyText}" FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"/> 回答3 我是使用WPF并接触上述示例的新手,我也有类似的经验
  • 回发后运行javascript函数(Run javascript function after Postback)
    问题 在updatepanel中回发后如何运行javascript事件 回答1 您可以使用ClientScriptManager在重新加载时调用函数: ClientScriptManager.RegisterStartupScript(this.GetType(), "AKey", "MyFunction();", true); http://msdn.microsoft.com/zh-CN/library/asz8zsxy.aspx 回答2 您可以使用PageRequestManager endRequest事件。 <form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:Button runat="server" Text="Button" /> </ContentTemplate> </asp:UpdatePanel> </div> </form> <script type="text/javascript"> var prm = Sys.WebForms.PageRequestManager
  • jQuery自动完成扩展器回发后不起作用(Jquery Auto complete extender not working after postback)
    问题 我在ASP.Net中使用Web服务使用jQuery自动完成功能。我已经使用自动完成功能来过滤员工代码。当页面加载时,自动完成功能工作正常,但是当我单击搜索按钮后,自动完成功能无法正常工作。 我认为问题出在document.ready函数中,所以当页面加载时它可以正常工作,但是我也必须在buttonclick事件之后使用自动完成功能。 我怎样才能做到这一点 ??? 这是我的jQuery Autocomplete <link href="../AutoComplete/jquery-ui.css" rel="stylesheet" type="text/css" /> <script src="../AutoComplete/jquery.min.js" type="text/javascript"></script> <script src="../AutoComplete/jquery-ui.min.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function () { $("#<%=txtEmpcode.ClientID %>").autocomplete({ source: function (request, response) { $
  • 以JavaScript正确的方式设置asp:label的Text属性(Set Text property of asp:label in Javascript PROPER way)
    问题 我在表单上有一系列文本框。 当用户在这些文本框中插入数字时,将进行计算并通过JavaScript更新<asp:Label>控件以反映这些计算: document.getElementById('<%=TotalLoans.ClientID %>').innerHTML = TotalLoans; 这样可以正确更新UI。 但是,当我尝试访问后面代码中的值时, Text属性为空。 我猜这是有道理的,因为我是通过JavaScript更新innerHTML属性的。 //TotalLoans.Text will always be equal to "" in this scenario double bTotalLoans = string.IsNullOrEmpty(TotalLoans.Text) ? 0.00 : Convert.ToDouble(TotalLoans.Text); 如何通过JavaScript更新<asp:Label>的Text属性,以便可以在后面的代码中读取该属性? 更新 对于包含41个标签的大型表单,这是一个小问题,每个标签都会为用户显示一些计算结果。 根据FishBasketGordo的建议,我将<asp:Label>转换为禁用的<asp:TextBox> 。 我正在这样设置新文本框的值: document.getElementById('<%
  • asp.net文本框失去焦点的方法?(Lost Focus method for asp.net textbox?)
    问题 如何为asp.net文本方法编写“丢失焦点”方法? 请任何人有任何想法写这个,与我分享吗? 回答1 因此,我知道每个人都展示了基本的客户端方法,这很好,但是我想至少展示一种用于在服务器上处理特定客户端事件的解决方案。 让我们看一下代码,然后一步一步地遍历它。 由于ASP.Net TextBox不会公开OnBlur的服务器端事件,因此您必须手动执行此操作。 幸运的是,这很容易实现。 假设您的.aspx页中有少量的代码。 每当TextBox失去焦点时,您都​​希望更新Label控件服务器端。 <asp:Label ID="lblOnBlur" runat="server">On Blur Example</asp:Label><br /> <asp:TextBox ID="tbOnBlur" runat="server" ClientIDMode="Static" /><br /> <asp:Label ID="lblOutput" runat="server" /> ASP.Net具有内置的客户端功能,该功能被调用以触发采用两个参数的回发: 目标(导致事件的控件的ID) 参数(您要传递给服务器的可选信息) 您可以通过在TextBox中添加以下属性和值来对事件进行标记: onblur="__doPostBack('tbOnBlur','OnBlur');" 但是
  • 在不使用Ajax的asp.net回发后执行javascript函数(Execute javascript function after asp.net postback without Ajax)
    问题 我希望在不使用ajax的情况下在asp.net回发后执行javascript函数。 我没有运气就尝试了以下偶数方法: Page.ClientScript.RegisterStartupScript(GetType(), "ShowPopup", "showCheckOutPopIn('Livraison',556);"); 回答1 由于不推荐使用Page.ClientScript属性,因此您应该使用ScriptManager类。 ClientScriptManager类是ASP.NET 2.0中的新增功能,它替代了用于管理现已弃用的脚本的Page类方法。 参考:MSDN-Page.ClientScript属性 ScriptManager的优点是它可以与异步回发一起使用,因此,如果您使用的是AJAX,它将不能与ClientScriptManager一起使用。 您的代码如下所示: ScriptManager.RegisterStartupScript(this, this.GetType(), "ShowPopup", "showCheckOutPopIn('Livraison',556);", true); 还要注意,如果您正在使用AJAX并具有一段javascript代码,并且希望在多个回发中执行,那么您应该在firstargument中引用UpdatePanel,例如:
  • 选择:jQuery 插件……在 asp.net 回发后不起作用(Chosen : jQuery plugin…does not work after postback in asp.net)
    问题 我在drop-down list使用 http://harvesthq.github.io/chosen/ control 。 一切都很顺利,但我面临一个问题,比如我正在设置下拉列表的属性,即AutoPostBack="true" ,在选择一项后,控件失去其属性并转换为普通drop-down list 任何人都可以对此有任何想法吗? 请建议我。 谢谢 回答1 如果您在$(document).ready();中绑定插件$(document).ready(); ,然后添加此代码并检查。 $(document).ready(function(){ //Binding Code Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler); function EndRequestHandler(sender, args) { //Binding Code Again } }); 回答2 尝试添加此代码, <script type="text/javascript"> $(document).ready(function () { Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(PageLoaded) })
  • 回发后JavaScript无法正常工作(Javascripts not working after postback [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 6年前关闭。 改进这个问题 我正在使用 asp.net Web 应用程序上的引导程序组件。 它工作正常,但奇怪的是,他们在页面回发后停止工作。 外表是好的,但行为不是。 这就是为什么我认为问题涉及 javascript 文件。 例如,一个 dorp down 按钮:回发后,扩展操作不起作用。 你知道这可能是什么原因吗? 回答1 如果您使用 UpdatePanel 进行部分页面刷新,那么当面板的内容通过 AJAX 更新时,通常的$(document).ready(...) / $(...)内容不会再次触发,这意味着作为 Bootstrap 一部分的自定义 JS 功能(如下拉菜单)不会重新绑定到新元素。 我通常做的是将设置 javascript 事件处理程序和行为的代码提取到它们自己的函数中(例如function BindEvents() { ... } ),然后我在更新面板中使用以下代码以确保它重新-在部分回发后运行(以及在初始页面加载时): <script type="text/javascript"> Sys.Application.add_load(BindEvents); </script> 编辑:这是一个建议的基本BindEvents()函数
  • 验证失败的回发后如何保留f:viewParam值[重复](How to retain f:viewParam values after postback with validation failed [duplicate])
    问题 这个问题已经在这里有了答案: 在JSF表单提交上保留GET请求查询字符串参数(2个答案) 5年前关闭。 我有简单形式的xhtml页面。 此页面用于几个数据表。 为了指定数据表(依此类推),我使用GET请求参数。 xhtml页面通过接收 <f:metadata> <f:viewParam id="page" name="page" value="#{itemsBean.page}"/> </f:metadata> 并再次通过导航规则,例如 <navigation-case> <description> Global rule for going to the items page from any page </description> <from-outcome>items</from-outcome> <to-view-id>/items.xhtml</to-view-id> <redirect> <view-param> <name>page</name> <value>#{itemsBean.page}</value> </view-param> </redirect> </navigation-case> 但是如果我像这样在xhtml文件中使用输入 <h:inputText id="itemName" value="#{itemsBean.name}"
  • 在ASP.NET回发后保持当前的jQuery手风琴窗格处于打开状态?(Keep the current jQuery accordion pane open after ASP.NET postback?)
    问题 我在asp.net aspx weppage上有一个jQuery手风琴。 在窗格内部,我有asp.net按钮。 当我单击该按钮时,我所在的窗格将关闭并重新加载页面,默认情况下为第一个窗格。 我不介意重新加载,但是有一种方法可以在重新加载后使当前窗格保持打开状态。 现在,我只是在具有手风琴ID的div上调用手风琴()。 回答1 您可以使用一个隐藏的输入字段在回发期间持久保存活动的手风琴索引,然后在手风琴的change事件期间使用javascript填充它。 <asp:HiddenField ID="hidAccordionIndex" runat="server" Value="0" /> <script language="javascript" type="text/javascript"> $(function(){ var activeIndex = parseInt($('#<%=hidAccordionIndex.ClientID %>').val()); $("#accordion").accordion({ autoHeight:false, event:"mousedown", active:activeIndex, change:function(event, ui) { var index = $(this).children('h3').index(ui
  • 页面回发后(ASP.NET)在Div上保持滚动条位置(Maintain scroller position on Div after page postback (ASP.NET))
    问题 我有这样的股利: <div style="overflow-y: scroll; height: 260px"> 我包含数百条记录,并允许我选择一个项目以填充其下方的formview控件。 问题在于,当页面回发时,滚动器位置将返回到div的顶部。 我想尝试保持其位置,以便所选记录仍然可见。 有任何想法吗? 回答1 放置类似: <asp:HiddenField id="hdnScrollPos" runat="server"/> in your aspx. 然后,一些javascript,例如: var hdnScroll = document.getElementById(<%=hdnScrollPos.ClientID%>); var bigDiv = document.getElementById('bigDiv'); bigDiv.onscroll = function() { hdnScroll.value = bigDiv.scrollTop; } window.onload = function () { bigDiv.scrollTop = hdnScroll.value; } 回答2 这是为我工作的使用JQuery的FlySwat解决方案的一种更完善的方法: var $ScrollPosition = $('#hfScrollPosition'); var
  • jQuery手风琴在asp.Net回发后未重新启动(jquery accordion not re-initiating after an asp.Net postback)
    问题 我用以下方法触发了一个jQuery手风琴: $(document).ready(function(){ $('#accordion').accordion(); }); 问题是这是一个.asp.NET应用程序,如果页面触发回发会破坏手风琴。 回发后如何重新启动手风琴? 抱歉,我不是asp.NET的专家,也很抱歉,我无法为您提供示例的链接,因为这是受密码保护的应用程序。 谢谢。 回答1 回发后,您需要使用UpdatePanel函数重新初始化手风琴,如下所示: <script type="text/javascript"> $(document).ready(function(){ var prm = Sys.WebForms.PageRequestManager.getInstance(); prm.add_initializeRequest(InitializeRequest); prm.add_endRequest(EndRequest); // on page ready first init of your accordion $('#accordion').accordion(); }); function InitializeRequest(sender, args) { } function EndRequest(sender, args) { // after