如何在用戶控件中傳遞屬性和方法?由於控件的執行在頁面執行之後,因此常常是無法獲取控件傳遞的值。如:上傳文件控件,如果做成用戶控件則在提交時無法獲取上傳的文件名,解決的方法是用反射機制(Reflection),定義用戶控件的屬性,用來傳值,定義用戶控件的方法,用來傳遞屬性值到調用頁面。
頁面Page中Page_Load:
//用Reflection(反射機制)獲取用戶控件的類型.此處為:ucType = {Name = "usctrlupload_ascx" FullName = "ASP.usctrlupload_ascx"} usctrlupload_ascx是用戶控件名對應的名稱,是從調試中復制。
Type ucType = UsCtrlUpload1.GetType ();
//用PropertyInfo獲取用戶控件中的屬性.
PropertyInfo UctextName= ucType.GetProperty("PicName");// PicName是用戶控件中的屬性,定義如後附。
//設置和獲取用戶控件中的值.
UctextName.SetValue(UsCtrlUpload1,"123456",null );//用PropertyInfo實例的方法測試賦值。只是測試一下設置值的效果,主要的是下面如何獲取控件的屬性值。
Label2.Text = UctextName.GetValue (UsCtrlUpload1,null ).ToString ();//UsCtrlUpload1用戶控件ID。
//這樣也可以獲取和設置控件中的屬性值.但好象不穩定,時行時不行的.
Label2.Text = UsCtrlUpload1.PicName;
頁面Page的Button事件中:
protected void Button1_Click(object sender, EventArgs e)
{
Type ucType = UsCtrlUpload1.GetType();
//用MethodInfo類來獲取用戶控件中的方法.
MethodInfo UcMethod = ucType.GetMethod("Button1_Click");// Button1_Click控件中的方法。
//在此處頁面的方法中執行用戶控件中的方法.
object[] argumentArrray = new object[2];
UcMethod.Invoke(UsCtrlUpload1, argumentArrray);//調用用戶控件中的方法。此處執行了!!。
PropertyInfo UctextName = ucType.GetProperty("PicName");
Label2.Text = UctextName.GetValue(UsCtrlUpload1, null).ToString();//獲取了上傳的文件名信息。並顯示在page頁面上。
//這樣也可以獲取和設置控件中的屬性值.但好象不穩定,時行時不行的.
//Label2.Text = UsCtrlUpload1.PicName;
}
附:
用戶控件.cs文件中定義的屬性:
public string PicName
{
get { return Label2.Text; }
set { Label2.Text = value; }
}
用戶控件.cs文件中定義的方法:
public void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
Label2.Text = FileUpload1.PostedFile.FileName;
}
注:此處借用了Button的事件方法,完全可以隨意改。並且控件中沒有Button,Button是放在頁面中的。