web-dev-qa-db-ja.com

カスタムメッセージボックスを作成する方法

コントロールを使用してカスタムメッセージボックスを作成しようとしています。

_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」から派生できません。静的クラスはオブジェクトから派生する必要があります

Screenshot of my form

では、MessageBoxはどのように実装されていますか?

12
Sen Jacob

フォームクラスは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を作成する必要はありません。ただし、「ヘルパー」クラスを実際のフォームから分離して、呼び出し側がコンストラクターでフォームを作成できないようにします(もちろん、同じアセンブリ内にいる場合を除きます)。

21
Dan Abramov

クラスが静的である必要はありません。次のようなことをしてください:

public partial class Msg : Form
{
    public static void show(string content, string description)
    {
         Msg message = new Msg(...);
         message.show();
    }
}
5
Lior Ohana

そのメソッドの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");を使用してメッセージボックスを表示できます。

ちなみに、ネーミングを考え直して、一貫したネーミングパターンを守る必要があります。 Msgshow命名ガイドライン に一致しない弱い名前です—ぜひチェックしてください!

2
Marius Schulz