2011-10-26 15 views
0

多くの異なる画面を持つマルチパネルのリアルデバイスシミュレータを設計していますが、現在のアプローチはコードからのすべてのスクリーンオブジェクトを追加して、切り替えたときにそれらを破棄することです別の画面にメソッドからクラススコープオブジェクトを定義することは可能ですか?

私はいくつかの固定オブジェクトを持っています。これは、すでに定義されている実際のデバイスボタンです。問題は、私は方法で各パネルの構造を分離しています。たとえば、buildLogin()buildMainScreen()などです。有効な場合は、有効な機能ラベルの色を緑に変更するか、無効の場合は白。

私の質問は:変数宣言セクションで定義されているように、クラス全体でアクセス可能なメソッドからオブジェクトを宣言することは可能でしょうか?それはPHPのGLOBALのようなものです。

私はオブジェクトを処分するとき、私はそれらを "再作成"することができないため、いつものようにすべての上に宣言することができません。 ...

[EDIT]サンプルコード:

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コレクションに作成されました。

たとえば、作成する他のコントロールから一意に識別するID値(button1.ID = "textUpdatedButton")をbutton1に指定します。次に、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

オブジェクトをクラスレベルで[静的]として定義します。このようにすると、クラスのすべてのインスタンスのすべてのメソッドからアクセスできます(インスタンスを削除すると影響はありません)。

+0

いいえ、私はこの行に配置されたオブジェクトにアクセスできないと言っています。 "panLoginMenu.Controls.Add(btnRemember);" btnRememberは静的なコントロールです... – henriquesirot

関連する問題