js+C#后台的问题

烟波钓 2011-11-11 06:11:50
需求:根据用户输入的东西,进行模糊查询,得到的查询结果放到一个ListBox中供用户进行筛选;
我的解决方案:
1.在用户输入的onkeyup中调用JS代码;
2.在js代码中调用C#的后台代码;
3.C#的后台代码中有根据当前文本框的值获得数据并绑定到文本框下面的一个listBox中
问题是:
加入我要输入一个“zh”,“z”按下并且还没弹起时,按下“h”,放开“h”后在放开“z”;这时那个文本框就莫名的失去焦点了:


不知道大家有么有遇到过这个问题 求大侠解救
大体代码如下:
<script type="text/javascript" language="javascript">
function aa(obj,charkey)
{
// alert(event.charkey);
if(event.keyCode==40)
{
if(obj.id=="txtManager")
{
var aa=document.getElementById("Name_Result");
aa.focus();
}
else
{
var aa=document.getElementById("lst_Name");
aa.focus();
}
}
else
{
// __doPostBack('txtManager','');
}
obj.focus();
}
</script>
<asp:TextBox ID="txtManager" runat="server" Width="200px" onkeyup="javascript:aa(this,event.keyChar);"
OnTextChanged="txt_ManagerChange" onfocus="setCursorPos(this);"></asp:TextBox>

public void txt_ManagerChange(object sender, EventArgs e)
{
BLLUser bllUser = new BLLUser();
TextBox CurTxt = (sender as TextBox);
string nameLike = CurTxt.Text;
if (nameLike != null && nameLike.Length > 0)
{
ListBox NameList = new ListBox();
if (CurTxt.ID == "txtManager")
{
NameList = Name_Result;

}
else
{
GridViewRow row = Grv_FS.Rows[Grv_FS.EditIndex];
NameList = (row.FindControl("lst_Name") as ListBox);
}
NameList.Visible = true;
DataTable table = bllUser.GetSimilarMemberByName(nameLike);
NameList.DataSource = table;
NameList.DataTextField = "name";
NameList.DataValueField = "MemberId";
NameList.DataBind();
if (table != null && table.Rows.Count > 0)
NameList.SelectedIndex = 0;
}
CurTxt.Focus();
}
...全文
214 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿非 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 on1y_1onely 的回复:]
[/Quote]

告诉看书,必然是有原因的.

有些问题不是三言两语就能说清楚的,你觉得描述的很清楚,可最后他还是不明白为什么.

烟波钓 2011-11-14
  • 打赏
  • 举报
回复
谢谢大家了 周末回去又好好的想了想这个问题 ,我的思路的确有问题
1.onkeyup事件触发js方法调用的后台的方法中每次都要跟数据库进行一次交互,这样的实现是很忌讳的
2.当同时在线的用户比较多时 必然会出问题 谢谢大家了
结贴了
yeyuhongchch 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ciznx 的回复:]

看到问题,我想了一些思路。
正当想回答的时候看了一眼代码,于是我很快地关掉了此页,不想回答了。
说实话,看到这样的代码,我挺难受的。

最终还是重新打开了,希望能给楼主一些帮助。
我想说楼上的回答足以回答问题,但对于楼主,显然过于简单;相信楼主看了回答之后还是一头雾水。

我只想说清楚一个问题,那就是 ASP.NET 中页面的提交机制。
ASP.NET 之所以能做到如此“便捷”地……
[/Quote]
2 使用 ASP.NET Ajax 控件,请参考 AutoComplete 的使用 网上有现成的东西,引用,加入方法就行。
我这刚用过
on1y_1onely 2011-11-13
  • 打赏
  • 举报
回复
__doPostBack('txtManager','');

你看看微软是怎么封装的__doPostBack函数......这个就是form的直接提交啊哥们.....
andyalex 2011-11-12
  • 打赏
  • 举报
回复
前面几楼的说的对,
用OnTextChanged是要postback的,刷新页面,那你的js代码就无效了,
可以用updatePanel,无刷新的提交,或者用ajax从后台取出数据,然后在前台写到listbox里
flyerwing 2011-11-12
  • 打赏
  • 举报
回复
一大片看的人听不懂。
on1y_1onely 2011-11-12
  • 打赏
  • 举报
回复
只提用ajax这个想法太肤浅了

这里涉及到的问题有js dom 浏览器兼容性 等问题, 当然也有开发效率,不过做为开发者,可以使用第三方控件

但是其中的原理还是需要知道的

onkeyup 的想法 是不对的,因为中文会有ime问题的,如果诸位不懂什么是ime 请自己搜索

所以一般的autocomplete或者是suggest的做法是settimeout检查文本框,然后发送请求

这个时候有两点问题,一点是请求和返回速度不一样这个如何解决?一般来说是ajaxthreadpool 做个线程池

果断在回调中判断

还有一个你的控件是否要给与多个不同的站点调用(楼主不涉及),这个时候需要考虑的是浏览器的sandbox(不懂的

请自行搜索),跨域是不能用xmlhttp or xmlhttprequest的, 一般的解法是用添加script标记 判断html事件

如果这时就以为问题已经结束了,那想得就很简单了

为什么这么说呢,很简单,不同的站点有utf-8 和 gb2312 也有其他的,不过中文站点以这两种编码为主

所以当跨站点访问时怎么解决呢,普通的request就搞不定了,当时我用的是request.raw.url开始截

然后用的是解编码格式方案 判断utf-8 的格式,具体方案需要检查一下自己的代码了,这个也可以从网上搜索

-------------------------------------
推荐本书吧 <<Ajax in action>>

相信看过之后,会给你带来惊喜.
--------------------------------------

to sandy945

不一定非得看书,你好好解答,而不是为分而来,也会有很多惊喜的,你的实力又不弱,不像其他人都是纯菜鸟

何必跟他们多废话呢
ASPNETCHENGXU 2011-11-12
  • 打赏
  • 举报
回复
果断用ajax
烟波钓 2011-11-12
  • 打赏
  • 举报
回复
楼上大家的大体我了解了:
我说一下我的思路吧:
1.textBox的那个文本内容改变的所触发的重新绑定 是由那个JS代码启动的,也就是说没有直接走 txt_ManagerChange这个后台方法;
2.textbox的onkeyup中调用了 __doPostBack('txtManager',''); (不好意思,调试的时候忘记放开了),通过这个函数来调用的后台的方法,这样做 就是不想让刷
烟波钓 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hetengfei_ 的回复:]
我就提一个问题吧。

楼主,你应该不要用asp.net自带的控件。
这些控件用他的事件的话,界面经常刷新,
用户体验相当的不好。
用Ajax吧。
[/Quote]
想要的结果就是根据用户输入的内容 模糊查询出来可能结果 没有用 服务器端的控件 他们没有Onkeyup事件了
烟波钓 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yxw545061402 的回复:]
首先来说,你这样的““z”按下并且还没弹起时,按下“h”,放开“h”后在放开“z””尝试都是错误的
如果用组合键还好说,你要按照一般用户的操作习惯,输入一个文本框,应该会很容易的一件事情吧!
还有就是,你这里的focus多个地方都设置有,你还是只设置一个地方吧,一般来说,文本框,不应该设置textchanged,况且你还没有设置autopostback
[/Quote]出现这种情况是正常的 打字快了 就出现这种现象 丢失焦点
风骑士之怒 2011-11-12
  • 打赏
  • 举报
回复
setCursorPos函数也贴出来啊,
阿非 2011-11-12
  • 打赏
  • 举报
回复
能理解磨刀不误砍柴工么?
ciznx 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sandy945 的回复:]

#4的回复 没有说到重点
推荐本书吧 <<Ajax in action>>

[/Quote]

好吧,我承认我只是泛泛而谈了各种方案,但更针对问题本身
但,作为楼主,他的当务之急是要解决问题,而不是去读一本书

我也提供其他建议,楼主有时间可以自行研究

myhaikuotiankong 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lmaohuanl 的回复:]
引用 3 楼 hetengfei_ 的回复:

我就提一个问题吧。

楼主,你应该不要用asp.net自带的控件。
这些控件用他的事件的话,界面经常刷新,
用户体验相当的不好。
用Ajax吧。
支持这种说法,楼上那哥们说的很透彻,顶
[/Quote]++
阿非 2011-11-11
  • 打赏
  • 举报
回复
#4的回复 没有说到重点

输入并不是一个连续的操作

推荐本书吧 <<Ajax in action>>

相信看过之后,会给你带来惊喜.
黄亮 2011-11-11
  • 打赏
  • 举报
回复
用settimeout;来处理,比如设置1秒后操作,如果一秒内又有输入就取消前面的timeout设置,重新开始1秒钟
LMAOhuaNL 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hetengfei_ 的回复:]

我就提一个问题吧。

楼主,你应该不要用asp.net自带的控件。
这些控件用他的事件的话,界面经常刷新,
用户体验相当的不好。
用Ajax吧。
[/Quote]支持这种说法,楼上那哥们说的很透彻,顶
ciznx 2011-11-11
  • 打赏
  • 举报
回复
看到问题,我想了一些思路。
正当想回答的时候看了一眼代码,于是我很快地关掉了此页,不想回答了。
说实话,看到这样的代码,我挺难受的。

最终还是重新打开了,希望能给楼主一些帮助。
我想说楼上的回答足以回答问题,但对于楼主,显然过于简单;相信楼主看了回答之后还是一头雾水。

我只想说清楚一个问题,那就是 ASP.NET 中页面的提交机制。
ASP.NET 之所以能做到如此“便捷”地提交数据,让开发者感觉就像是开发在本地运行 winform 程序一样开发 web 程序,是因为它封装了 web 中的表单。而它所有的视图状态(诸如控件状态、数据绑定状态等)都由 View State 引擎负责存取。

关键的一点是,这一套机制完全依赖 HTML 的表单提交机制,任何业务逻辑的处理过程都要通过提交表单来实现。这也是 ASP.NET 页面中为什么总是要求有一个标记为 runat 为 server 的 form 元素的原因所在。

那么现在楼主的问题就出现了,有时候我们不希望表单被提交,因为提交表单意味着回发页面、页面被强制刷新。一旦页面刷新,之前在界面上使用 Javascript 构建的视图和状态就白费了。所以在楼主的问题里,你 focus 与不 focus 的效果不会有什么不同。

解决楼主的问题思路有三条,供选择:
1 使用 ASP.NET 中提供的回调机制,请参考我关于回调的文章
2 使用 ASP.NET Ajax 控件,请参考 AutoComplete 的使用
3 使用自定义 Ajax 方式来解决,请参考 在 asp.net 中实现 AutoComplete

目前来说,能最快解决问题并较好地达到效果的是第1条思路
hetengfei_ 2011-11-11
  • 打赏
  • 举报
回复
我就提一个问题吧。

楼主,你应该不要用asp.net自带的控件。
这些控件用他的事件的话,界面经常刷新,
用户体验相当的不好。
用Ajax吧。
加载更多回复(1)

62,074

社区成员

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

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

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

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