Asp.net設定預設按鈕的方法總結

iDotNetSpace發表於2008-09-05
第1種方法:
就是在Asp.net的頁面中找到
 
設定form的屬性 defaultbutton=“預設按鈕ID”
這個是我在VS2005中式的,不知道2003中是嗎






第2種方法:
http://www.cnblogs.com/netufo/archive/2004/12/21/79841.html

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;
        }

    }

沒幾行程式碼,自己看吧。


第3種方法:
http://www.cnblogs.com/squirrel_sc/archive/2004/11/22/67206.html

由於asp.net裡面的button都是submit型別的,所以在表單內按回車都是觸發的第一個按鈕的click事件,如果有多個button則無法在回車的時候觸發後面的按鈕事件。以下方案可通過設定來改變頁面的預設按鈕。

1.在基頁面內的load事件里加入supportDefaultButton()

2.基頁面中宣告變數:
Protected DefaultButton As Button

3.在基頁面中加入函式supportDefaultButton並過載RaisePostBackEvent
    Private Sub supportDefaultButton()
        GetPostBackEventReference(
New System.Web.UI.Control)
        RegisterStartupScript(
"DefaultButton""
")
    
End Sub


    
Protected Overloads Overrides Sub RaisePostBackEvent(ByVal sourceControl As System.Web.UI.IPostBackEventHandler, ByVal eventArgument As String)
        
If (DefaultButton Is Nothing OrElse Request("__EVENTTARGET"<> ""Then
            
MyBase.RaisePostBackEvent(sourceControl, eventArgument)
        
ElseIf (Not DefaultButton Is NothingThen
            
MyBase.RaisePostBackEvent(DirectCast(DefaultButton, System.Web.UI.IPostBackEventHandler), Nothing)
        
End If
    
End Sub

4.DefaultButton.js檔案內容:
for(i=0;i<Form1.elements.length;i++)
{
    
if(Form1.elements[i].type == "submit")
    {
        fstsubmit 
= Form1.elements[i]
        fstsubmit.attachEvent(
"onmouseup", changeEvent)
        //
break; 這一句應該去掉
    }
}
function changeEvent()
{
    __doPostBack(event.srcElement.id, '')
}

在繼承頁面的load事件裡:
5.DefaultButton = 需要設定為預設按鈕的物件名稱
即可。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-442005/,如需轉載,請註明出處,否則將追究法律責任。

相關文章