有asp.net裡面用了form runat=server的表單的時候,裡面的<asp:button .. 總不能按個斷行符號提交表單,很是不爽。
現在終於發現了一個屬性可以幹這個事情,用 this.Form.DefaultButton = "ContentPlaceHolder1$btsubmit";
值得注意的是,如果用了masterPage(母板頁),那麼要在按鈕ID前加上母板的ID:ContentPlaceHolderID和一個美元符($)
代碼如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="login.aspx.cs" Inherits="login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:TextBox runat="server" ID="wd" ></asp:TextBox><asp:Button ID="btsubmit" runat="server" Text="提交" OnClick="btsubmit_Click" />
...........................
</asp:Content>
含母板頁的類中:
protected void Page_Load(object sender, EventArgs e)
{
this.Form.DefaultButton = "ContentPlaceHolder1$btsubmit";
}
非母板頁的類中:
protected void Page_Load(object sender, EventArgs e)
{
this.Form.DefaultButton = "btsubmit";
}
---------------------------------------------------另一種辦法是做一個控制項-----------------------------------------------------------
大家都知道。如何頁面只有一個按鈕的話。按斷行符號的話。是可以提交的。此時的做法也非常簡單。在click中直接寫代碼就可以了。頁面在提交時,它黓認是提交第一個控制項的。所以。我在頁面的最上面放一個長寬都為0的伺服器按鈕button1。然在在button1_onclick()中寫要提交的代碼就可以了。運行時,你按下斷行符號提交。這時頁面提交的就是button1的事件了。哈!是不是很簡單!
缺點:
不用我說了,每個頁面只能存在一個斷行符號提交的事件。
---------------------------------------------------另一種辦法是做一個控制項-----------------------------------------------------------
自己寫一個控制項繼承TextBox,增加一個SubmitControl 屬性用來指定此文字框上按斷行符號時由哪個按鈕來響應。
再做一個Converter增加設計時支援,就是在設計時可以用下拉框選擇提交按鈕。
目前只考慮了Button、LinkButton和ImageButton作為提交按鈕,當然繼承它們的控制項也可以。
本例知識點:控制項、屬性、繼承。
繼承:是一個進程,通過繼承,一個對象可以獲得另一個對象的屬性(包括函數),並可向其中加入屬於自己的一些特徵。作為C++語言的一種重要機制,用繼承的方法可以自動為一個類提供來自另一個類的操作和資料結構,進而使程式設計人員在一個一般的類的基礎上很快建立一個新的類,而不必從零開始設計每個類。
當一個類被其他的類繼承時,被繼承的類稱為基類,又稱為父類。
繼承其他類屬性的類稱為衍生類別,又稱為子類。
一般情況下,繼承的進程起源於一個基類的定義,基類定義了其所有衍生類別的公有屬性。從本質上講,基類具有同一類集合中的公用屬性,衍生類別繼承了這些屬性,並且增加了自己特有的屬性。從任何已存在的類繼承的實質就是建造新的衍生類別。
實現過程
1)先建立一個新項目WEB控制項陳列庫,將此段代碼加進去。
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();
}
publicoverrideSystem.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;
}
}
2)將此檔案產生.dll檔案,在工具箱中添加此dll檔案。
3)將此控制項拖入相應頁面,在Page_Load中加上[此控制項的名字].SubmitControl="所提交的按鈕的名字";
例如:
WebCustomControl1.SubmitControl="Button1"(雙引號不要去掉了!)
當往WebCustomControl1輸入完內容之後按斷行符號Button1響應。