textbox触发ontextchanged事件之前记录光标位置

贾谷瑶 2015-08-13 01:50:32
已经实现如下功能:

输入框触发ontextchanged事件后会自动生成一行。
如图:

主要代码:
动态生成的textbox控件
TextBox tb = new TextBox { ID = "txtName" + i + "", Width = Unit.Parse("60px"), AutoPostBack = true};
tb.TextChanged += new System.EventHandler(tb_OnChange);
事件函数:
protected void tb_OnChange(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;
string name = tb.ID;
string num = name.Substring(name.Length-1, 1);
int a = System.Windows.Forms.Cursor.Position.X;
int b = System.Windows.Forms.Cursor.Position.Y;
if (Convert.ToInt16(ViewState["tdNum"]) <= Convert.ToInt16(num))
{
CreateTr(Convert.ToInt16(num) + 1);
cursor_Enter(a,b);
}
}



现在的问题是:
如果第一个文本框输入后,点击第二个文本框,会自动生成一行,但光标会消失,需要重新点进第二个文本框,会给用户造成麻烦。
所以想在TextChanged事件触发之前记录光标位置,之后再重新恢复光标位置。但是不知道怎么在事件触发之前保存?或者有没有别的方法?
各路大神,请赐教!!!!
...全文
331 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
贾谷瑶 2015-08-14
  • 打赏
  • 举报
回复
哦,因为隐藏控件是服务端控件,需要用这个来获取 document.getElementById('<%=HiddenField1.ClientID %>').value
贾谷瑶 2015-08-14
  • 打赏
  • 举报
回复
还是有问题,单步调试了一下 if (HiddenField1.Value.Length > 0) 这句话就进不去了 我想可能是因为 tb.Attributes.Add("onfocus", "abc('" + tb.ID + "')"); 这句没有把ID值赋给隐藏控件?
ajianchina 2015-08-13
  • 打赏
  • 举报
回复
我上面的代码是符合你的要求的,但不过会存在另一个问题,就是过老的浏览器可能不支持html5,所以我干脆改了一下,通过一个隐藏控件HiddenField来存储焦点控件的名称,这样也满足了你不想在加载时重设焦点,同时也不存在是否支持html5的问题了。

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="xxx.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<script type="text/javascript">
    //设置HiddenField值
	function abc(c) {
		document.getElementById("HiddenField1").value = c;
	}
</script>
<body>
    <form id="form1" runat="server">
		<!-- 这儿放一个隐藏控件 -->
		<asp:HiddenField ID="HiddenField1" runat="server" />
    <div>
    </div>
    </form>
</body>
</html>

TextBox tb = new TextBox { ID = "txtName" + i + "", Width = Unit.Parse("60px"), AutoPostBack = true};
tb.TextChanged += new System.EventHandler(tb_OnChange);
tb.Attributes.Add("onfocus", "abc('" + tb.ID + "')");

protected void tb_OnChange(object sender, EventArgs e)
{
	TextBox tb = (TextBox)sender;
	string name = tb.ID;
	string num = name.Substring(name.Length - 1, 1);
	if (HiddenField1.Value.Length > 0)
	{
		//通过HiddenField1.Value取得原先焦点textbox,注意,这里的Panel1是我用的容器,你按你的容器改一下
		TextBox tbf = Panel1.FindControl(HiddenField1.Value) as TextBox;
		tbf.Focus();
	}
}
贾谷瑶 2015-08-13
  • 打赏
  • 举报
回复
大哥,你真是好人一个。 可我不是想让加载的时候设置光标,是在执行完ontextchanged事件之后设置光标
ajianchina 2015-08-13
  • 打赏
  • 举报
回复
就当是我想多了吧,我看还是贴一下吧

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="xxx.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<!-- 你就贴在这儿吧 -->
<script type="text/javascript">
	window.onload = function () {

		document.getElementById(sessionStorage.getItem("focus")).focus();
	}

	function abc(c) {
		sessionStorage.setItem("focus", c);
	}
</script>
<body>
    <form id="form1" runat="server">
    <div>
    </div>
    </form>
</body>
</html>
ajianchina 2015-08-13
  • 打赏
  • 举报
回复
给你贴在前台aspx里的js代码,你为何一定要弄到cs里去呢?
贾谷瑶 2015-08-13
  • 打赏
  • 举报
回复
引用 11 楼 ajianchina 的回复:
http://www.w3school.com.cn/html5/html_5_webstorage.asp 先了解一下sessionStorage,这是html5的web数据存储方式之一,生命周期只在本窗体内,没有时间约束。 js的意思就是当一个textbox取得焦点时将该控件名称存入sessionStorage,页面重载时再从sessionStorage中取得上次焦点控件的名称,并再次使其取得焦点。
恩,原理我是明白了 我现在用后台执行document.getElementById(sessionStorage.getItem("focus")).focus();,试了网上好几种方法都没用,要怎么弄呢?
ajianchina 2015-08-13
  • 打赏
  • 举报
回复
http://www.w3school.com.cn/html5/html_5_webstorage.asp 先了解一下sessionStorage,这是html5的web数据存储方式之一,生命周期只在本窗体内,没有时间约束。 js的意思就是当一个textbox取得焦点时将该控件名称存入sessionStorage,页面重载时再从sessionStorage中取得上次焦点控件的名称,并再次使其取得焦点。
贾谷瑶 2015-08-13
  • 打赏
  • 举报
回复
引用 8 楼 ajianchina 的回复:
上码 TextBox tb = new TextBox { ID = "txtName" + i + "", Width = Unit.Parse("60px"), AutoPostBack = true}; tb.TextChanged += new System.EventHandler(tb_OnChange); tb.Attributes.Add("onfocus", "abc('" + tb.ID + "')"); protected void tb_OnChange(object sender, EventArgs e) { TextBox tb = (TextBox)sender; string name = tb.ID; string num = name.Substring(name.Length - 1, 1); //将原来下面的删掉 }

<script type="text/javascript">
	window.onload = function () {

		document.getElementById(sessionStorage.getItem("focus")).focus();
	}

	function abc(c) {
		sessionStorage.setItem("focus", c);
	}
</script>
下面的JS代码没看懂啊?
ajianchina 2015-08-13
  • 打赏
  • 举报
回复
实现原理就这样,相关的首次加载时sessionStorage值的判断你再稍加细化就行
ajianchina 2015-08-13
  • 打赏
  • 举报
回复
上码 TextBox tb = new TextBox { ID = "txtName" + i + "", Width = Unit.Parse("60px"), AutoPostBack = true}; tb.TextChanged += new System.EventHandler(tb_OnChange); tb.Attributes.Add("onfocus", "abc('" + tb.ID + "')"); protected void tb_OnChange(object sender, EventArgs e) { TextBox tb = (TextBox)sender; string name = tb.ID; string num = name.Substring(name.Length - 1, 1); //将原来下面的删掉 }

<script type="text/javascript">
	window.onload = function () {

		document.getElementById(sessionStorage.getItem("focus")).focus();
	}

	function abc(c) {
		sessionStorage.setItem("focus", c);
	}
</script>
  • 打赏
  • 举报
回复
服务器控件好像有个tabindex的把,事件执行完了不能设置哪个控件获取焦点?
贾谷瑶 2015-08-13
  • 打赏
  • 举报
回复
表沉,自己顶一个
贾谷瑶 2015-08-13
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
你是把 asp.net 服务器端程序当作 WinForm 了。这只能重学。
大神,经常看你出没在各个帖子里,今天也终于光顾的我帖子了 你看看我这种情况该怎么办啊?
  • 打赏
  • 举报
回复
你是把 asp.net 服务器端程序当作 WinForm 了。这只能重学。
chengkouda 2015-08-13
  • 打赏
  • 举报
回复
你是客户端的事件必须用JS
贾谷瑶 2015-08-13
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
代码都已经写成这样了,再用js太麻烦了。 我想的是 获取光标位置: int a = System.Windows.Forms.Cursor.Position.X; int b = System.Windows.Forms.Cursor.Position.Y; 恢复光标位置: cursor_Enter(a,b); protected void cursor_Enter(int a,int b) { Point pt = new Point(a, b); System.Windows.Forms.Cursor.Position = pt; } 就是想在焦点失去之前获取光标位置
於黾 2015-08-13
  • 打赏
  • 举报
回复

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧