コントロールを使用してカスタムメッセージボックスを作成しようとしています。
_public static partial class Msg : Form
{
public static void show(string content, string description)
{
}
}
_
実際、このフォームにいくつかのコントロール(グリッドビュー)を配置する必要があり、このウィンドウに独自のテーマを適用する必要があるため、MessageBox
を使用したくありません。私は私のような他のフォームからこれを呼び出したいです
_Msg.show(parameters);
_
このフォームのオブジェクトを作成したくありません。
Form
クラスは静的ではないため、継承できないことはわかっています。しかし、MessageBox
は静的なので、どのように実装されているのでしょうか。 MessageBox.show("Some message!");
のように呼び出されています
継承が許可されていないため、エラーが発生します。
静的クラス「MyFormName」はタイプ「System.Windows.Forms.Form」から派生できません。静的クラスはオブジェクトから派生する必要があります
では、MessageBox
はどのように実装されていますか?
フォームクラスはstatic
である必要はありません。実際、静的クラスはまったく継承できません。
代わりに、internal
から派生したForm
フォームクラスを作成し、public static
ヘルパーメソッドを表示します。
この静的メソッドは、基になるフォームについて呼び出し元に「知らせたくない」場合、別のクラスで定義できます。
/// <summary>
/// The form internally used by <see cref="CustomMessageBox"/> class.
/// </summary>
internal partial class CustomMessageForm : Form
{
/// <summary>
/// This constructor is required for designer support.
/// </summary>
public CustomMessageForm ()
{
InitializeComponent();
}
public CustomMessageForm (string title, string description)
{
InitializeComponent();
this.titleLabel.Text = title;
this.descriptionLabel.Text = description;
}
}
/// <summary>
/// Your custom message box helper.
/// </summary>
public static class CustomMessageBox
{
public static void Show (string title, string description)
{
// using construct ensures the resources are freed when form is closed
using (var form = new CustomMessageForm (title, description)) {
form.ShowDialog ();
}
}
}
補足:Jalal 指摘 のように、static
メソッドを含めるためにクラスstatic
を作成する必要はありません。ただし、「ヘルパー」クラスを実際のフォームから分離して、呼び出し側がコンストラクターでフォームを作成できないようにします(もちろん、同じアセンブリ内にいる場合を除きます)。
クラスが静的である必要はありません。次のようなことをしてください:
public partial class Msg : Form
{
public static void show(string content, string description)
{
Msg message = new Msg(...);
message.show();
}
}
そのメソッドの1つを静的に呼び出すためにクラスstatic
を作成する必要はありません—特定のメソッドを宣言するだけで十分ですstatic
として。
_public partial class DetailedMessageBox : Form
{
public DetailedMessageBox()
{
InitializeComponent();
}
public static void ShowMessage(string content, string description)
{
DetailedMessageBox messageBox = new DetailedMessageBox();
messageBox.ShowDialog();
}
}
_
フォームをmodalウィンドウとして表示するためにmessageBox.ShowDialog()
を使用しています。 DetailedMessageBox.ShowMessage("Content", "Description");
を使用してメッセージボックスを表示できます。
ちなみに、ネーミングを考え直して、一貫したネーミングパターンを守る必要があります。 Msg
とshow
は 命名ガイドライン に一致しない弱い名前です—ぜひチェックしてください!