私のプロジェクトで実装した簡単できれいな解決策は、ユーザーが入力をしたときにトリガーされるコールバック関数(C#のAction<T>
)を使用することです。
にShowDialogを使用した例:
private void cmdGetList_Click(object sender, EventArgs e)
{
string strInput = "";
frmInputBox frmDialog = new frmInputBox("User input:");
if (frmDialog.ShowDialog() == DialogResult.OK)
strInput = frmDialog.prpResult;
else
strInput = null;
}
それはMDIメインフォームの外の入力ボックス。
Now;ショーを使用したソリューション:
private void cmdGetList_Click(object sender, EventArgs e)
{
getInput(this, (string strResult) =>
{
MessageBox.Show(strResult);
});
}
private void getInput(Form frmParent, Action<string> callback)
{
// CUSTOM INPUT BOX
frmInputBox frmDialog = new frmInputBox("User input:");
// EVENT TO DISPOSE THE FORM
frmDialog.FormClosed += (object closeSender, FormClosedEventArgs closeE) =>
{
frmDialog.Dispose();
frmDialog = null;
};
frmDialog.MdiParent = frmParent; // Previosuly I set => frmParent.IsMdiContainer = true;
// frmDialog.ShowDialog(); <== WILL RAISE AN ERROR
// INSTEAD OF:
frmDialog.MdiParent = frmParent;
frmDialog.FormClosing += (object sender, FormClosingEventArgs e) =>
{
if (frmDialog.DialogResult == DialogResult.OK)
callback(frmDialog.prpResult);
else
callback(null);
};
frmDialog.Show();
}
入力ボックス(または任意のフォームがMDI親フォーム内に表示されます):
トリックをするときに管理するためにコールバック関数(C#の上のアクション)を使用することですユーザは入力を行う。
もっとコードラインですが、クリーンなプロジェクトを表示するのは無駄です。
フォームのMdiParentプロパティを設定しないでください。ShowDialog()は正常に動作します。 –