2017-10-12 85 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); 
      } 
     }