是否可以从方法中定义类范围对象?

时间:2011-10-26 13:47:49

标签: c# class scope local

这可能看起来完全不合理,但我一直在设计一个多面板,真实的设备模拟器,它有许多不同的屏幕,我目前的方法是仅从代码中添加所有屏幕对象并在我处理它们时处理它们切换到另一个屏幕。

我有一些固定的对象,它们是已经定义并且到位的真实设备按钮。问题是,我在方法中分离每个面板构造,例如: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!";
    }
}

2 个答案:

答案 0 :(得分: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!";
    }
}

实际的实现将随着您构建控件的方式而变化,但实质上这种方法可以让您在代码中动态构建所有内容,如果您需要这样做的话。请记住使用标识符让您稍后查找。

答案 1 :(得分:0)

在类级别定义您的对象,如静态。这样,它可以从类的所有实例的所有方法访问(处理实例不会影响它)。