如何Typecaste控件并访问其属性?

时间:2014-06-05 12:06:24

标签: c# generics reflection .net-4.0

IDE:Visual Studio,C#.net 4.0

我有两个相同的用户控件uc1和uc2,两者都有一个名为txtbox1的文本框 现在看到这个代码,textbox1在设计器中是公共的,所以它可以在form1.cs中评估,Form 1是简单的windows表单,它有uc1和uc2。

在form1中看到我在onLoad_form1方法中调用的这个函数。

UserControl currentUC; //Global variable;  

public void loadUC(string p1)
{
  //Here I want:
  if(p1 == "UC1)
  {
      currentUC = uc1;
  }
  if(p1 == "UC2)
  {
      currentUC = uc2;
  }
}

比调用基于currentUC值更新textbox1的另一个函数

//on load
currentUC.textbox1.text = "UC1 called";

//Here I am getting error "currentUc does not contains definition for textbox1"  

如果我这样做:     uc1.textbox1.text =“UC1 text”;     uc2.textbox1.text =“UC1 text”; //它可以工作,但基于p1字符串变量我希望将控件设置为uc1或uc2,而不是我想访问其子控件。请建议如何执行此操作。

请不要告诉else else块,因为我必须在各个地方使用此功能。

感谢。

@Lee答案: - 仅适用于文本框,但我有两个用户控件,即两个不同的用户控件,而不是它的实例。 UserControlLeft和UserControlRight都有相同的文本框,列表框等(有微小的设计更改),我想根据一些字符串“left”和“right”访问/加载它。

4 个答案:

答案 0 :(得分:3)

由于文本框具有相同的名称,您可以在Controls集合中查找它们:

TextBox tb = (TextBox)currentUC.Controls["textbox1"];
tb.Text = "UC1 called";

更好的解决方案是在用户控件类中添加一个属性,用于设置内部文本属性,例如

public class MyUserControl : UserControl
{
    public string Caption
    {
        get { return this.textbox1.Text; }
        set { this.textbox1.Text = value; }
    }
}

答案 1 :(得分:0)

我认为你在这里混合了几件事。

  1. 首先,你说你有2个完全相同的用户控件,你的意思是ascx文件是相同的,还是你在页面上有2个相同用户控件的实例?
  2. 我们选择所有有效选项:

    1。要找到一个控件并进行转换:

    假设您有以下aspx代码段:

    <div>
        <uc1:MyCustomUserControl id="myControl" runat="server" />
        <uc1:MyCustomUserControl id="myControl2" runat="server" />
    </div>
    

    如果您现在想要访问该控件,则应执行以下操作:

    public void Page_Load()
    {
        var myControl ((MyCustomUserControl)FindControl("MyControlName"));
    
        // On 'myControl' you can now access all the public properties like your textbox.
    }
    

答案 2 :(得分:0)

在WPF中你可以这样做:

//加载MAINFORM

public void SetText(string text)
{
   CLASSOFYOURCONTROL ctrl = currentUC as CLASSOFYOURCONTROL ;

   ctrl.SetText(text);
}

//在控件SUB中

public void SetText(string text)
{
   textbox1.text = "UC1 called"

}

我认为这也适用于winforms。并且比直接从子控件访问控件更干净

答案 3 :(得分:0)

@ Lee的方法很好。另一种方法是使用带有公共setter的公共属性(文本框不需要以这种方式公开)。

或一个界面(这样你就不会关心你在特定时刻所拥有的课程 - 而且没有ifs):

public interface IMyInterface
{
  void SetTextBoxText(string text);
}

public partial class UC1: UserControl, IMyInterface
{
   public void SetTextBoxText((string text)
   {
       textBox1.Text=text;
   }

//...
}

public partial class UC2: UserControl, IMyInterface
{
   public void SetTextBoxText((string text)
   {
       textBox1.Text=text;
   }

//...
}

使用代码:

((IMyInterface)instanceOfUC1).SetTextBoxText("My text to set");
((IMyInterface)instanceOfUC2).SetTextBoxText("My text to set");