2016-05-01 18 views
0

私はVBボックスを使いたくないので、私はカスタムInputBoxを書いています。だから私は、フォームを閉じるときにボックスの結果を返すようにしたいと思います。C#フォームの結果を返す方法

私は、フォームのコードに過負荷を追加しました:

public InputBox() 
{ 
    InitializeComponent(); 
} 

public string InputBox(string LabelText, string Title, string DefaultResult) 
{ 
    return DefaultResult; 
} 

はその良いアプローチですかまたは私はコンストラクタを変更することができますでしょうか?ありがとう。

答えて

3

個人的には、典型的にはモーダルであるこれらの種類の「ユーティリティ」フォームについては、私はコンストラクタを非公開にして行くことを好む。何かのように:

private InputBox() // Constructor is private 
{ 
    InitializeComponent(); 
} 

public static string GetValue(string LabelText, string Title, string DefaultResult) 
{ 
    using(var form = new InputBox()) 
    { 
     form.myLabel.Text = labelText; 
     form.Text = Title; 
     form.myTextBox.Text = DefaultResult; 
     if(form.ShowDialog() == DialogResult.OK) 
     return form.myTextBox.Text; 
    } 
    return DefaultResult; 
} 

そして使用それが好き:

string myValue = InputBox.GetValue("foo","bar","baz"); 
コメントで要求されたよう

は、ここstatic方法を使用せずに、それを行うためにいくつかの他の方法です...それは基本的にです同じですが、フォームの処理を発信者に委任してください:

InputBoxクラス:

private string _defaultResult; 

public InputBox(string LabelText, string Title, string DefaultResult) 
{ 
    InitializeComponent(); 
    myLabel.Text = LabelText; 
    Text = Title; 
    _defaultResult = myTextBox.Text = DefaultResult; 
} 

public string GetValue() 
{ 
    return this.DialogResult == DialogResult.OK ? myTextBox.Text : _defaultResult; 
} 

、呼び出し元に:可能性が高く、このフォームを使用する-only-合理的な方法はモーダルダイアログで、これは潜在的に混乱させる可能性があるので、私は、この方法を奨励していないことを

string myValue = "baz"; 
using(var form = new InputBox("foo", "bar", myValue)) 
{ 
    form.ShowDialog(); 
    myValue = form.GetValue();  
} 

注意そのクラスのユーザー

単純な静的メソッド(プライベートコンストラクタを使用すると、他の方法でフォームを呼び出し元によってインスタンス化できない)を使用すると、呼び出し元にフォームの設計方法を知らせる必要がなくなります使用する方法は1つだけです。

+0

これは素晴らしいですね!私が 'InputBox'をオーバーロードすると同じではないでしょうか?または、あなたはそのような過負荷にすることはできませんか? – ib11

+1

InputBoxに過負荷を定義する "、私はあなたを取得していません。あなたのメソッド 'InputBox'を呼び出すことを意味するならば、あなたのクラス名が' InputBox'なら...できません。試してみてください:コンパイルエラーが出ます(あなたのサンプルコードはコンパイルされません。コンストラクタから返ることができず、あなたが属するクラスのような他のメソッドに名前を付けることはできません) – Jcl

+1

もしあなたが*できないとしても、それはおそらく非常に悪いことです。 'InputBox'静的メソッドを' InputBox.InputBox'名前空間の 'InputBox'クラスに置くことを想像してください。おそらく' var myValue = InputBox.InputBox.InputBox.InputBox( "foo "、" bar "、" baz ");これはどんなにまともな会社でもコードを作成した人の発砲の理由になるでしょう:-) – Jcl

関連する問題