11

別のフォームからフォームの変数にアクセスしたい。メインフォーム内のボタンをクリックすると、メインフォームを親として設定し、メインフォームの変数にアクセスする別のフォーム(子フォーム)を表示します。私のクリックハンドラーは次のとおりです。

private void btnSystem_Click(object sender, EventArgs e)
{
    Form_EnterPassword EP = new Form_EnterPassword();
    EP.Parent = this;        //error: Top-level control cannot be added to a control
    EP.ShowDialog();
}

エラーなしで正常にコンパイルされます。ただし、メインフォームを実行して[システム]ボタンをクリックすると、例外がスローされます。同じボタンクリックで別のコード(私のものではない)で同様のことを行い、エラーは発生しません(メインフォームを親として設定するだけです)。

私は何が間違っているのですか?これを引き起こす何かが私のメインコードにありますか?

4

6 に答える 6

18

最善の方法は、プロパティを使用EP.ShowDialog(this)して後で使用することです。Owner

于 2012-05-24T22:21:47.757 に答える
10

EP.TopLevelプロパティをfalseに設定する必要があります。それはあなたがそれに親を設定することを可能にします。

参考文献。

別の形式の変数とコントロールにのみアクセスしたい場合は、親の関係を介さずに、他の方法でアクセスできる可能性があります。

于 2012-05-24T22:22:00.173 に答える
1

OK、どうやらそれを行う方法は電話することです

Form_Child.ShowDialog(this)

それから私は電話することができます

FromParent_aVariable = ((Form_Parent)this.Owner).aVariable;

または、名前空間のプロパティでaVariableを定義すると、

FromParent_aVariable = NameSpace.Properties.Settings.Default.aVariable;

2つの方法があります。

于 2013-02-25T22:51:06.657 に答える
0
Form_EnterPassword EP = new Form_EnterPassword();
EP.MdiParent = this;       
EP.Show();

このようにしてみてください、それは私にとって役立ちます。フォームのプロパティでprincipalformをisMdicontainer=trueとして設定する必要があります

于 2018-10-29T16:37:58.323 に答える
0

最近も似たような状況でした。私は似たようなことを試みていましたが、別のクラスから子フォームを制御することによって。

注: 子フォームの「TopMost」を許可しないものに設定しようとしています。
この場合、「MdiContainer」です。


これを達成するには:

•MainFormの「isMdiContainer」プロパティを無効にします(とにかくその使用は廃止されました)。

•Form(s)TopMostプロパティをtrueに設定します。

•これで、機能を実行できるようになります。


**コード例:**
/* On your Main Form Class */

private void btnSystem_Click(object sender, EventArgs e)
{
    // Instantiate the Form_EnterPassword by passing the MainForm
    Form_EnterPassword EP = new Form_EnterPassword(this);
    EP.Show(); // No longer as modal Form to display in front.
}

/* Under your EnterPassword Form Class */

// Do not create a new Instance of MyMainForm.
// You want to use the same thread as your MainForm
private MyMainForm mainForm;

/* Constructor */
public Form_EnterPassword(MyMainForm form)
{
    mainForm = form;
    this.Owner = mainForm; // "this" refers to the: EnterPassword Form.
}


備考:( 完璧を達成するために)あなたが(おそらく)しなければならない唯一の追加のことは、MainForm>WindowStateをチェックすることです。フォームを最小化または特定の状態にするためのコードブロックを作成します。

すなわち:

if (WindowState == FormWindowState.Minimized)
{ /* Code to Minimize all the Child Forms. */ }

else { /* Code to bring all Forms to their "Normal" State */ }
于 2020-01-23T13:11:57.973 に答える
-1

このように書くと、親フォームの中央にダイアログが表示されます。

   Form_Child.StartPosition = FormStartPosition.CenterParent;
   Form_Child.ShowDialog(this);
于 2016-02-02T03:40:37.277 に答える