2011-10-26 48 views
0

这似乎是完全不合理的要求,但我一直在设计一个多面板的真实设备模拟器,它有很多不同的屏幕,我目前的方法是只添加代码中的所有屏幕对象,并在我切换时处理它们到另一个屏幕。是否可以通过方法定义类作用域对象?

我有一些固定的对象,这是真正的设备按钮,已经定义和到位。事情是,我在方法中分隔每个面板结构,例如:buildLogin(),buildMainScreen()等,我需要从这些方法编辑一些屏幕对象,如启用时将启用的功能标签的颜色更改为绿色或白色如果禁用。

我的问题是:是否有可能从整个类中可访问的方法声明对象,就像它是在变量声明部分中定义的一样?这将是像PHP中的GLOBAL。

我无法像在任何事物上一样声明它,因为当我处理这些对象时,我不能“重新创建”它们,因为父母或重新使用已处理的对象或其他东西...

[编辑]示例代码:

public partial class frmMain : Form 
{ 
    //I could as well do this: 
    //Button button1 = new Button(); 

    public frmMain() 
    { 
     buildLogin(); 
    } 

    private void buildLogin() 
    { 
     Panel panel1 = new Panel(); 
     Controls.Add(panel1); 

     //But then, there is no way to do this: 
     // if (button1.IsDisposed == true) //because of the panel, or smthing 
     Button button1 = new Button(); 
     panel1.Controls.Add(button1); 

     button1.Click += (s, f) => { panel1.Dispose(); buildMainMenu(); }; 
    } 

    private void buildMainMenu() 
    { 
     Panel panel2 = new Panel(); 
     Controls.Add(panel2); 

     Button button2 = new Button(); 
     panel2.Controls.Add(button2); 
    } 

    //This was created from the Designer and is class-scoped 
    private void btn_Frame_TSK1_Click(object sender, EventArgs e) 
    { 
     //Here, I have no access to the objets I've created programatically. 
     //button1.Text = "Text changed!"; 
    } 
} 
+0

在这个设计中肯定会出现错误,提供一些代码,例如如何创建屏幕以及何时需要访问这样的全局对象? – sll

+0

你有没有想过使用面向对象的设计?这使它更容易。 – PVitt

+0

我对你之后的事情有些模糊 - 你不能只声明一个类作用域属性/字段,然后在你的方法中设置它吗?否则,可能重构传递的参数,然后你可以修改它们......这听起来像你的程序结构可能是什么需要改变这里... – Chris

回答

0

如果你想确保事情总是完全动态的,总是在后面的代码完成后,你可能会想看看搜索的控制你已经在Controls集合中创建。

例如,确保给button1一个ID值(button1.ID =“textUpdatedButton”),它将从您创建的其他控件中唯一标识它。然后使用FindControl或在Controls集合上进行搜索以找到具有要在事件处理程序中定位的ID的控件。

//This was created from the Designer and is class-scoped 
private void btn_Frame_TSK1_Click(object sender, EventArgs e) 
{ 
    Control control = this.FindControl("textUpdatedButton"); 
    if(control != null && control is Button){ 
     Button button1 = (Button)control; 
     button1.Text = "Text changed!"; 
    } 
} 

另外,为了使事情看起来更像是一个变量,你可以使用属性来隐藏控制发现(如前所述):

private Button Button1 { 
    get { return (Button)this.FindControl("textUpdatedButton"); } 
} 

//This was created from the Designer and is class-scoped 
private void btn_Frame_TSK1_Click(object sender, EventArgs e) 
{ 
    if(this.Button1 != null){ 
     this.Button1.Text = "Text changed!"; 
    } 
} 

实际的实施将改变与你如何建立建立你的控制,但基本上这种方法可以让你在你的代码中动态地构建一切,如果你需要这样做的话。只记得使用标识符让你以后找到东西。

+0

迄今为止的最佳解决方案... – henriquesirot

0

在类级别定义您的对象,为Static。这样它就可以从类的所有实例的所有方法中访问(处置实例不会影响它)。

+0

不,仍然说我不能访问这一行中的处置对象“panLoginMenu.Controls.Add(btnRemember);” btn记住是静态控制... – henriquesirot

相关问题