2017-10-12 119 views
0

我有一個用戶控件,它包含基於接收輸入數據的模型動態生成的不同類型的服務器控件。如何使用屬性名修改asp.net servercontrol屬性值

它們可以是不同的控件(例如,文本框,下拉列表,編輯,多選,...)

我試圖寫一個方法來修改任何屬性值是一個模型產生的任何輸入控制領域。我想出了:

public void SetInputControlAttributeValue(Field field, string AttributeName, string AttributeValue) 
    { 

     if (field.ColumnIndex == 1) 
     { 
      WebControl control = inputControls_Column1.FindControl("input" + field.Name) as WebControl; 
      control.Attributes[AttributeName] = AttributeValue; 
     } 
     else if (field.ColumnIndex == 2) 
     { 
      WebControl control = inputControls_Column2.FindControl("input" + field.Name) as WebControl; 
      control.Attributes[AttributeName] = AttributeValue; 
     } 
    } 

當我把這個方法:

s.SetInputControlAttributeValue(modelFields.fields.FirstOrDefault(x => x.Name == "Name"), "Text", "default value"); 

屬性值分配,當我跟蹤它,我得到我所設置的值:

control.Attributes["Text"]="default value" 

但是!生成的TextBox控件的Text屬性仍然是empty.I平均:

((Textbox)control).Text="" 

由於輸入控件的類型可以是任何東西,客戶可能需要設定值輸入控制的任何財產,我需要一種方法來設置屬性值,而鑄造的控制,我的意思是什麼不喜歡:

Textbox textbox=((Textbox)control); 
textbox.Text="default value"; 

有什麼辦法來實現這一目標?

+0

,有在'SetInputControlAttributeValue'創造你的論點lambda表達式,但我會問,爲什麼你想要的。你的語法會比TextBox textbox =(TextBox)控件更清晰。 textbox.Text =「xyz」;' – DiskJunky

回答

0

我能找到辦法!

通過使用反射,可以設置具有名稱的任何屬性值。所以我改寫了SetInputControlAttributeValue方法如下:

public void SetInputControlAttributeValue(Field field, string AttributeName, string AttributeValue) 
     { 
      if (field.ColumnIndex == 1) 
      { 
       Control control = inputControls_Column1.FindControl("input" + field.Name); 
       control.GetType().GetProperty(AttributeName).SetValue(control, AttributeValue); 
      } 
      else if (field.ColumnIndex == 2) 
      { 
       Control control = inputControls_Column2.FindControl("input" + field.Name); 
       control.GetType().GetProperty(AttributeName).SetValue(control, AttributeValue); 
      } 
     }