自定義TextBox控制元件的實現

yuzhangqi發表於2008-11-26

需求:在實際應用開發中,經常需要查詢某些資料實體,返回其Name和ID,然後執行相關的業務操作。通常,透過一個“查詢”按鈕,彈出一個模態窗體,執行查詢,然後返回資料給父窗體。為了重用的需要,特開發一個TextBox控制元件,實現上述需求。

Code:

using System;
using System.ComponentModel;
using System.Text;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.ComponentModel.Design;

namespace Beyondsoft.GDMP.AspNetControls
{
///


/// 使用者選擇控制元件
///

[DefaultProperty("Text"),
ToolboxData("{0}:SelectTextBox>")]

public class SelectTextBox : WebControl, INamingContainer
{
protected System.Web.UI.HtmlControls.HtmlInputHidden hiddenObjectId;
protected System.Web.UI.WebControls.TextBox txtObjectName;
protected System.Web.UI.HtmlControls.HtmlButton button;


private HtmlTable uiTable;

public SelectTextBox()
{
CreateControls();
}

/**////


/// ID,ID中間使用","分隔
///

[Browsable(false),Category("設定"),Description("取得的物件值,中間使用','分隔"),DefaultValue("")]
public string Value
{
get
{
return hiddenObjectId.Value;
}
set
{
hiddenObjectId.Value=value.ToString();
}
}

/**////


/// 名稱,中間使用","分隔
///

[Browsable(false),Category("設定"),Description("物件名稱,中間使用','分隔"),DefaultValue("")]
public string Text
{
get
{
return txtObjectName.Text;
}
set
{
this.txtObjectName.Text = value.ToString();
}
}

[Category("設定"),Description("選擇頁面路徑"),Browsable(true), NotifyParentProperty(true)]
public string PageUrl
{
get
{
object obj=ViewState["PageUrl"];
return (obj==null)?string.Empty:obj.ToString();
}
set
{
ViewState["PageUrl"] = value;
}
}

/**////


/// 編輯框是否可見
///

[Category("設定"),Description("編輯框是否可見"),Browsable(true),DefaultValue(true)]
public bool IsVisable
{
get
{
object obj=ViewState["Visable"];
return (obj==null)?true:bool.Parse(obj.ToString());
}
set
{
ViewState["Visable"] = value;
}
}

/// 編輯框是否可輸入
///
[Category("設定"), Description("編輯框是否可輸入"), Browsable(true), DefaultValue(false)]
public bool TextBoxEnabled
{
get
{
object obj = ViewState["TextBoxEnabled"];
return (obj == null) ? false : bool.Parse(obj.ToString());
}
set
{
ViewState["TextBoxEnabled"] = value;
}
}

protected override void Render(HtmlTextWriter output)
{

this.button.Attributes.Add("onclick", string.Format("javascript:SetValue('{0}','{1}','{2}');", PageUrl, this.ClientID + "_ObjectName", this.ClientID + "_ObjectId"));
uiTable.RenderControl(output);

}

protected override void OnPreRender(EventArgs e)
{
RegisterClientScriptBlockJavaScript();
base.OnPreRender (e);
}

#region 發出客戶端指令碼 RegisterClientScriptBlockJavaScript()
private void RegisterClientScriptBlockJavaScript()
{
//如果已經註冊了指令碼則不再註冊
if(Page.ClientScript.IsClientScriptBlockRegistered("SetValue"))
{
return;
}
else
{
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "SetValue",SetValue().ToString());
}

}

public StringBuilder SetValue()
{
StringBuilder builder=new StringBuilder();
builder.Append("
return builder;

}

#endregion

private void CreateControls()
{
this.Width = Unit.Parse("100px");

uiTable = new HtmlTable();
//uiTable.ID = "uiTable";
uiTable.Width = "100%";
uiTable.Border = 0;

txtObjectName = new TextBox();
txtObjectName.ID = "ObjectName";
txtObjectName.Visible = this.IsVisable;
txtObjectName.Enabled = this.TextBoxEnabled;
txtObjectName.EnableViewState = true;
txtObjectName.AutoPostBack = false;
txtObjectName.Width = Unit.Parse("102px");


hiddenObjectId = new HtmlInputHidden();
hiddenObjectId.ID = "ObjectId";

this.button = new HtmlButton();
this.button.ID = "btnSelect";
this.button.Attributes.Add("Width","36");
this.button.InnerText = "選擇";
//this.button.Attributes.Add("onclick",string.Format("javascript:SetValue('{0}','{1}','{2}');",PageUrl,this.ClientID +"_ObjectName",this.ClientID+"_ObjectId"));
this.button.CausesValidation = false;

HtmlTableRow tr = new HtmlTableRow();
HtmlTableCell td = new HtmlTableCell();

td.Controls.Add(txtObjectName);
td.Controls.Add(hiddenObjectId);
td.Controls.Add(button);
tr.Cells.Add(td);
uiTable.Rows.Add(tr);
this.Controls.Add(uiTable);
}
}
}

模態窗體返回查詢值的Javascript程式碼:


...................

[@more@]

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

相關文章