2016-12-15 9 views
0

親フォームの他のフォームから新しいタブページを追加したいとします。Winforms子フォームから親フォームへのtabPageの追加

私の親フォームはMainWindowであり、このフォームはTabControlです。 子フォームがあるChildForm子フォームボタンをクリックすると、TabControlに新しいタブページを追加したいのですが、MainWindowからです。

私はこれがSystem.NullReferenceExceptionをスローしますChildForm

private MainWindow mainWindow; 

public List(MainWindow form) 
{ 
    this.mainWindow = form; 
} 

private void createButton_Click(object sender, EventArgs e) 
{ 
    TabPage tabPage = new TabPage("ASD"); 

    mainWindow.MainTabControl.TabPages.Add(tabPage); 
} 

にコンストラクタの依存関係を作成しよう!

MainWindowアクセッサーの魔女はへのアクセスをMainWindowで返しますが、作成してみることもできません。

public static TabControl MainTabControl 
{ 
    get { 
     MainWindow self = new MainWindow(); 

     return self.mainTabControl; 
    } 
} 

私は新しい参照を作成し、それが問題であるため、これは機能しません。

私は2つの例を試してみると、うまくいきません。

この問題を解決する方法は他の誰かが知っていますか?

+0

あなたの最初の例を

public class ListForm: Form { public delegate void OnNewTabPage(string key); public event OnNewTabPage NewTabPage; public ListForm() { ..... } private void createButton_Click(object sender, EventArgs e) { // Here we pass to the subscriber of the event just a string as // the delegate requires, but, of course, you could change this // to whatever data you wish to pass to the mainwindow // Event a reference to an instance of a class with many fields... NewTabPage?.Invoke("ASD"); } } 

コードをこのイベントにサブスクライブし、そうするように要求されたときに、新しいタブページの作成を開始しますベストプラクティスはうまくいくはずです。デバッガを使用して、その式の中で何がnullであるか調べることはできますか? _mainWindow.MainTabControl.TabPages.Add(tabPage); _ – Steve

+0

'null'は' MainWindow'クラスのインスタンスを作成しないためです。 – Ivan

+0

ControlsのデフォルトのModifiers値は** Private **です。つまり、他のFormからTabControlにアクセスすることはできません。例外は、プロパティを介してパブリックにする試みの1つのためにほぼ確実です。あなたは単にTabControlのModifiers値をPublicまたはInternalに変更し、それから実際の名前を使用することができます: 'mainWindow.tabControl1.TabPages.Add(tabPage);' –

答えて

0

より良い方法は、MainWindowに新しいタブページを作成するタスクを残しておき、子フォームがMainWindowの内部詳細の何も知らないようにすることです。子フォームはイベントを公開し、新しいタブページ(またはMainWindowが何をしたいか)を作成する時であることを親に通知したいときに子フォームがそれを発生させます。それはないながらメインウィンドウは、メインフォームで....

ListForm f = new ListForm(); 
f.NewTab += CreateTabPage; 
f.Show(); 

private void CreateTabPage(string key) 
{ 
    TabPage page = new TabPage(key); 
    this.TabControl.TabPages.Add(page); 
} 
+0

あなたは私を理解できません! 'MainWIndow'は' TabControl'インスタンスを保持するだけです。他のフォームからは、既存のtabcontroのMainWindowの中にtabPagesを追加したいと思います。新しいタブごとにこの例を書いてください。私は 'MainWindow'の中に新しいコードを書いて、その新しいフォームのために' MainWindow'に知らせる必要があります。 – Ivan

+0

私はそれを理解しましょう。あなたが私の知識で親と子の話をすると、MainWindowがChildFormを作成し、MainWindowが存在することを意味します(したがって、私はあなたの最初の例についてコメントしました)。これは間違っていますか?それが間違っている場合、誰がChildFormを作成しますか?なぜ、新しいTabPageを作成するときにMainWindowを変更する必要があるのですか?任意の子フォーム内に記述するのと同じコードをメインウィンドウに配置する必要があります。また、タブページの要件が異なる新しい子フォームを作成すると、同じコードを記述する場所が異なります。あなたは正しい、私は理解していない。 – Steve

+0

こんにちは、なぜあなたが '.Invoke()'を使っているのか説明できますか? – McNets

関連する問題