2016-11-04 3 views
1

私は1つのフォームといくつかのクラスを持つwindowsフォームアプリケーションを持っています。シングルトン:nullを返すフォームインスタンス

Form1インスタンスからいくつかのtextBoxesの値を取得し、その値を抽出します。これを達成する

私の最初の方法は、フォームを取得するためにApplication.OpenForms[]配列を使用していたが、私は私が直接アクセスすることができ、他のことは不可能だろうとのForm1クラスにシングルトンを使用すると、より効率的であることに気づきましたインスタンス。

1.コントロールクラスからコントロールを取得するにはForm1の

シングルトンが

のForm1
内部クラス を設定
class Controls 
{ 
    //Request Form1 instance 
    private static Form1 form = Form1.GetInstance(); 

    //Sets global values for easy access with getters and null setters 
    //--Variable 'form' is still null hence I get the NullReferenceException 
    private TextBox employer = form.Controls["textBoxEmployerName"] as TextBox; 
    private TextBox role = form.Controls["textBoxRole"] as TextBox; 
    private TextBox company = form.Controls["textBoxCompanyName"] as TextBox; 
    private TextBox website = form.Controls["textBoxWebsite"] as TextBox; 
    private TextBox refNumber = form.Controls["textBoxRefNumber"] as TextBox; 
    private TextBox reason = form.Controls["textBoxReason"] as TextBox; 
    private TextBox dateListed = form.Controls["textBoxDateListed"] as TextBox;  
    private Label charLimit = form.Controls["labelCharsRemaining"] as Label; 

    public TextBox Employer { get { return employer; } } 
    public TextBox Role { get { return role; } } 
    public TextBox Company { get { return company; } } 
    public TextBox Website { get { return website; } } 
    public TextBox RefNumber { get { return refNumber; } } 
    public TextBox Reason { get { return reason; } } 
    public TextBox DateListed { get { return dateListed; } }  
    public Label CharLimit { get { return charLimit; } } 
    } 
} 

2.:ここ

は、私はそれを設定している方法です

public partial class Form1 : Form 
{ 
    private static Form1 theInstance; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    //Return instance of Form1 
    //--This is obviously returning null for some reason 
    public static Form1 GetInstance() 
    {   
      if (theInstance == null) 
       theInstance = new Form1(); 
      return theInstance;      
    } 

おそらく私はクラスからシングルトンを取得しようとすると "NullReferenceException"を受け取っていますForm1

次のように私が使用している以下の方法がある:

  • をWindows.OpenForms [ "をForm1の"]を用いてコントロール[ " - somecontrol--"]
  • Windows.ActiveForm
  • を使用します。クラスをForm1

これらの方法の全てにシングルトンデザインパターンを使用するには、nullを返していると私はそれがnullを返すする理由を考えるカント。

助けが必要です。

ありがとう

+0

'form'はnullですか? 'as'演算子は、キャストが機能しない場合はnullを返し、' form.Controls ["nonExistentasdf323"] 'も' null'を返します。 – Quantic

答えて

1

私はForm1のインスタンスからいくつかのテキストボックスの値を取得し、値を抽出します。

ここでは、アプローチをやり直す必要があります。フォームはを表します。データのです。ただし、データそのものはモデルにする必要があります。ビューとは別の場所です。

テキストボックスは、雇用者、会社、ロール、Webサイトなどの文字列プロパティを持つPersonオブジェクトなど、一部のモデルオブジェクトの状態を反映する必要があります。フォームはそのオブジェクトのプロパティから読み取ってテキストボックスに表示し、テキストボックスの変更に反応して、モデルPersonオブジェクトに値を保存します。

Personをシングルトンにするか、他の普遍的な方法でアクセスすると、フォーム自体にアクセスすることなく、すべてのフォームから個人のプロパティにアクセスできます。

+0

あなたはMVCのアプローチについてお話していますか? – AnonDCX

+0

@AnonDCXはい、そうです。 MVCフレームワークなどを使用する必要はなく、MVCが意味する懸念を分離するだけです。 – dasblinkenlight

+0

ありがとう、私は再考し、懸念のいくつかの分離を実装する原則 – AnonDCX