2016-11-04 12 views
1

У меня есть приложение Windows Forms с одной формой и несколькими классами.Singleton: экземпляр формы возвращает null

Я хочу получить значения некоторых текстовых полей из примера Form1 и извлечь значения.

Мой первый способ достижения этой цели было с помощью Application.OpenForms[] массива, чтобы получить форму, но я понял, что с помощью синглтона на классе Form1 будет более эффективным, как я могу иметь прямой доступ, и было бы невозможно сделать другие экземпляров.

Вот как я поставил его:

1. управления класса для управления получает от 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. Singleton установить внутри класса Form1

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», когда пытаюсь получить Singleton из класса Form1.

Следующие методы, которые я использовал следующие:

  • Использование Windows.OpenForms [ "Form1"] Управление [ "- somecontrol--"]
  • Использование Windows.ActiveForm
  • . Использование паттерна Singleton Design на классе Form1

Все эти способы возвращают нуль, и я не могу думать о причине, почему она возвращается нуль.

Любая помощь будет воспринята.

Thankyou

+0

Вы уверены, что 'form' равно null? Оператор 'as' возвращает null, если приведение не работает, и я уверен, что' form.Controls ["nonExistentasdf323"] 'также вернет' null'. – Quantic

ответ

1

Я хочу, чтобы получить значение некоторых Textboxes из экземпляра Form1 и извлекать значение.

Здесь вы должны остановиться и переосмыслить свой подход. Формы представляют просмотров ваших данных; однако ваши данные должны находиться в модели , отдельном месте, не зависящем от вида.

Текстовые поля должны отражать состояние какого-либо объекта модели, например объект Person, который имеет свойства строки для работодателя, компании, роли, веб-сайта и т. Д. Форма будет считываться из свойств этого объекта, отображать их в текстовом поле, а затем реагировать на изменения текстового поля и сохранять значения обратно в объект модели Person.

Если вы сделали Person синглтон или предоставили какой-либо другой универсальный способ доступа к нему, вы сможете получить доступ к свойствам человека из всех форм, не обращаясь к самим формам.

+0

Хорошо, что вы говорите о подходе MVC? – AnonDCX

+0

@AnonDCX Да, это так. Не нужно использовать инфраструктуру MVC или что-то в этом роде, просто разделение проблем, которые подразумевает MVC. – dasblinkenlight

+0

Thankyou, я переосмысливаю и реализую некоторые принципы разделения принципов – AnonDCX

 Смежные вопросы

  • Нет связанных вопросов^_^