2012-03-29 10 views
2

私のプログラムでは設定ページがあります。設定ページには、プログラムを「常に上に」設定するオプションがあります。このオプションをオンまたはオフにすると、設定が正しく保存されますが、実際にはTopMostプロパティ自体は変更されません。DIFFERENTフォームのTopMostプロパティを変更しますか?

プログラムのメインフォームは「MainForm」と呼ばれますが、設定ページは「SettingsForm」と呼ばれます。 "MainForm"の "TopMost"プロパティを "SettingsForm"内からどのように変更できますか?

+2

現在どのようにしているのか教えてください。 –

+0

私は現在、それをやろうと「試み」はしていません...私は方法がわかりません。 –

答えて

1

SettingFormには、単にMainFormという言葉が使われています。必要に応じて後でアクセスできるフィールドに格納されるコンストラクタパラメータを使用して生成されます。例えば

public class SettingsForm 
{ 
    public SettingsForm(MainForm mainForm) 
    { 
     this.mainForm = mainForm; 
    } 

    public void Apple() 
    { 
     this.mainForm.TopMost = true; 
    } 

    private readonly MainForm mainForm; 
} 

public class MainForm 
{ 
    public void Banana() 
    { 
     var settingsForm = new SettingsForm(this); 
     settingsForm.ShowDialog(); 
    } 
} 

SettingsFormの所有者はすでにMainFormのinsntanceであるが、これは私はあなたが与えられたものから言うことができない場合は、これを行うために必要ではないかもしれない。)

+0

どうすればいいですか? –

+0

@JasonAxelrod:例を追加しました。 –

+0

私はこれを試しました...次のエラーがあります:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません –

1

これはメディエーターパターンに適した場所です。 (コントローラに似ています)概念は、すべてのウィンドウを作成し、コンストラクタを介して各フォームへの参照を渡す1つのオブジェクトを持っているということです。いずれかのフォームからメディエータのメソッドを呼び出すことができ、メディエータはMainFormにフォーカスします。これは、Windowsフォームでは非常に一般的な方法です。

だから、あなたがそうのようなメディエータークラスを作ります:

public class MyMediator { Form mainForm {get;set;} Form settingsForm{get;set;}

public MyMediator() 
    { 
     mainForm = new MainForm(this); 
     mainForm.Show(); 
    } 

    ... 

    public FocusMainForm() // call this from settings form 
    { 
     mainForm.TopMost = true; 
    } 


} 

+0

私はあなたがちょうど言ったか分かりません。 –

2

あなたが設定フォーム上のイベントを作成することができます。

public event EventHandler TopMostEvent; 

private void OnTopMostEvent() 
{ 
    if (TopMostEvent != null) 
    { 
     TopMostEvent(this, EventArgs.Empty); 
    } 
} 

CheckedChangedイベントで設定を保存した後、メソッドを呼び出します。

OnTopMostEvent(); 

メインフォームのサブスクライブイベントに追加して、フォームTopMostプロパティを設定してください。

関連する問題