netUFO's dotNET space

发条兔子的家 --- 我的黑夜比白天多
数据加载中……

解决 ASP.NET 中文本框上按回车时系统缺省提交按钮的问题

ASP.NET 中由于一个页面只有 Form ,经常碰到的一个问题是当在一个文本框中按回车后确不知哪个按钮被当成提交按钮提交了,非常郁闷!!!特别是在有用户控件时,搞得都不敢用 Validator 。
今天实在任不住把它搞定,其实也不麻烦。
基本思路:
自己写一个控件继承 TextBox,增加一个 SubmitControl 属性用来指定此文本框上按回车时由哪个按钮来响应。
再做一个 Converter 增加设计时支持,就是在设计时可以用下拉框选择提交按钮。
目前只考虑了  Button、LinkButton和ImageButton作为提交按钮,当然继承它们的控件也可以。

代码很少,就直接贴在这儿了。

ufoTextBox 控件:
    public class ufoTextBox : TextBox
    
{
        [TypeConverter(
typeof(SubmitableControlConvertor)), DefaultValue(""),Category("Behavior")]
        
public string SubmitControl
        
{
            
get
            
{
                
object ret = this.ViewState["SubmitControl"];
                
if (ret != null)
                
{
                    
return (string) ret;
                }

                
return string.Empty;
            }

            
set
            
{
                
this.ViewState["SubmitControl"= value;
            }

        }


        
protected override void AddAttributesToRender(HtmlTextWriter writer)
        
{
            
base.AddAttributesToRender(writer);
            
if(this.SubmitControl.Length > 0)
            
{
                Control con 
= FindControl(SubmitControl);
                
if(con != null)
                
{
                    
string script = "if(event.keyCode == 13){document.getElementById('" + con.ClientID + "').click();event.returnValue=false;}";
                    writer.AddAttribute(
"onkeydown",script);
                }

            }


        }

    }

自定义的 Converter,用于设计时支持:
    public class SubmitableControlConvertor : StringConverter
    
{
        
private object[] GetControls(IContainer container)
        
{
            ComponentCollection components 
= container.Components;
            ArrayList ret 
= new ArrayList();
            
foreach (IComponent control in components)
            
{
                
if (!(control is Button || control is LinkButton || control is ImageButton))
                
{
                    
continue;
                }

                Control button 
= (Control) control;
                
if ((button.ID != null&& (button.ID.Length != 0))
                
{
                    ret.Add(
string.Copy(button.ID));
                }

            }

            ret.Sort(Comparer.Default);
            
return ret.ToArray();
        }

 

        
public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        
{
            
if ((context != null&& (context.Container != null))
            
{
                
object[] controls = this.GetControls(context.Container);
                
if (controls != null)
                
{
                    
return new TypeConverter.StandardValuesCollection(controls);
                }

            }

            
return null;
        }


        
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        
{
            
return false;
        }


        
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        
{
            
return true;
        }

    }

没几行代码,自己看吧。

posted on 2004-12-21 03:39 netUFO 阅读(4905) 评论(10)  编辑 收藏 网摘 所属分类: .NET 开发

评论

#1楼   回复  引用    

这个问题也一直困扰着我,我都是用更笨的变通办法解决的。
多谢!
2004-12-21 10:23 | wuhoo

#2楼   回复  引用    

不错,但是将textbox设成多行文本时就不能换行了,要是能改了就更好了???
2005-08-23 17:33 | macoli[未注册用户]

#3楼   回复  引用    

本人比较菜,这个问题也稿了很久了。
但不知道你这个怎么用法的,能说详细点吗?
2005-09-02 09:45 | susan[未注册用户]

#4楼   回复  引用  查看    

string script = "if(event.keyCode == 13){document.getElementById('" + con.ClientID + "').click();event.returnValue=false;}";
writer.AddAttribute("onkeydown",script);

如果把这段代码修改一下,是不是就可以变成比如说自动跳转到另一个textbox等类似功能?

if (!(control is Button || control is LinkButton || control is ImageButton))
{
continue;
}

在这里添加控件的类型是?
2006-02-17 10:26 | 瓶子里的风      

#5楼   回复  引用  查看    

不错!
2007-02-05 10:41 | 岁月如梦      

#6楼   回复  引用    

非常感谢!
2007-05-14 18:34 | lib[未注册用户]

#7楼   回复  引用  查看    

先记住,以后可能会有用!呵呵
2007-08-24 15:45 | Koy      

#8楼   回复  引用    

所这个函数放在head标记之间,其中 txtUserPassword是用户输入时按回车的控件ID,btnLogin是用户按回车后要自动触发的按钮ID.
<script language="javascript">
function document.onkeydown()
{ if ((event.keyCode == 13) && (event.srcElement == document.getElementById("txtUserPassword")))
{ var btn = document.getElementById("btnLogin");
btn.focus();
btn.click();
}
}
</script>
2007-10-07 22:14 | 秋雨梧桐[未注册用户]

#9楼   回复  引用    

有一个稍微简单的方法:frmMain.DefaultButton = btnSearch.ID;
2008-01-06 09:15 | 思维境界[未注册用户]

#10楼   回复  引用    

如果使用了asp.net ajax 。
怎么使它,按回车提交 文本框的信息呢 ?
2008-08-28 09:37 | 求助[未注册用户]



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 79841




相关文章:

相关链接:

Locations of visitors to this page