2014-01-08 2 views
2

В C#, если вы создаете объект нажатием кнопки, в конце события click объект больше не находится в области видимости. Как создать объект нажатием кнопки, но отпустите его нажатием другой кнопки. Вот что я пытаюсь сделать:Объекты C# (создание и использование)

Создайте приложение, которое принимает данные пользователя и добавляет его в базу данных. Приложение содержит два класса: личная информация и информация о работодателе. Объект класса личной информации должен быть создан при нажатии кнопки «Начать приложение». Затем приложение открывает вкладку, которая запрашивает личную информацию. Если выбрана кнопка «Добавить работодателя», создается экземпляр Employer. После того, как они нажимают кнопку submit в конце, она должна закрыть один или два объекта и вернуться в главное меню. Когда следующий человек нажимает кнопку, он должен снова пройти процесс.

Я могу создавать объекты по клику или самому классу, но как вы ограничиваете жизнь объекта между нажатиями кнопок?

Спасибо!

+4

Вам нужно добавить поле в свой класс. – SLaks

+2

, если персональная информация имеет свойство (или поле), называемое работодателем, вы можете просто установить эти данные при нажатии второй кнопки. – paqogomez

+1

Объекты FYI не являются «по объему» или «вне сферы действия». «Область» - это свойство чисто компиляции; * scope * именованного объекта - это * область текста программы, в которую этот объект может быть указан этим именем *. Ваш вопрос на самом деле о * lifetime *, который связан с областью действия, поскольку время жизни объекта, последняя ссылка которого хранится в локальной переменной, либо длиннее, чем короче, либо равна объему этой переменной. Если вы внимательно читаете и задаетесь вопросом, могу ли я просто сказать, что сфера охвата и продолжительность жизни не связаны друг с другом, это правильно. –

ответ

2

Используйте элемент данных с классом. Очень быстрый пример:

public class MyClass 
{ 
    private Foo foo; 

    private void Button1_Click(object sender, EventArgs e) 
    { 
     this.foo = new Foo(); 
    } 

    private void Button2_Click(object sender, EventArgs e) 
    { 
     // I can access this.foo here. I can also dispose of it 
     // if it is IDisposable and/or I can set it to null. 
     // To check if button 1 was pressed, check to see if the object 
     // is null (if it is, button 1 wasn't pressed) 
    } 
} 
0

Похоже, что вы хотите использовать свойства?

Вот ссылка на MSDN, но есть много там, если вы просто Google'C# свойство

0

Я могу создавать объекты по щелчку или в самом классе, но как вы ограничиваете жизни объект между нажатиями кнопок?

К сожалению, вы в значительной степени застреваете с помещением в класс. Нет простого способа ограничить область действия объекта несколькими методами внутри класса. Если ваши 2 обработчика событий могут получить доступ к вашему Работодателю, тогда каждый другой метод может быть в классе. Вам просто не нужно его использовать.

Однако из любопытства мне удалось взломать и произвести эффект, который вы хотите. Я сделал класс с двумя обработчиками событий, по одному для каждой кнопки, а также с частной переменной Employer.

public class ButtonHandler 
{ 
    private Employer employerData; 

    public void button1_Click(object sender, EventArgs e) 
    { 
     employerData = "set data here"; 
    } 

    public void button2_Click(object sender, EventArgs e) 
    { 
     employerData = "use/clear data here"; 
    } 
} 

Тогда я пошел к моему Form.Designer.cs и вручную изменил обработчик событий button.Click от значения по умолчанию this.btnLoadPlaylist_Click для выполнения своих функций в классе ButtonHandler выше. Проблема в том, что он удаляется каждый раз, когда Designer.CS восстанавливается Visual Studio. Таким образом, эффект возможен, просто не удобно с инструментами, которые мы даем.

+0

Если вы не поместили это в файл designer.cs и не изменили ваши обработчики, чтобы указать на этот класс, он не будет сдуваться, когда дизайнер будет сброшен. – paqogomez

+0

'' Нет простого способа ограничить область действия объекта несколькими методами внутри класса. "[На самом деле.] (Http://stackoverflow.com/a/21007557/1159478) – Servy

1

Вы можете сделать это, определив один из обработчиков событий анонимно внутри другого обработчика событий:

void button1_Click(object sender, EventArgs e) 
{ 
    Foo data = new Foo(); 
    EventHandler handler = null; 
    handler = (s, args) => 
    { 
     //Use Foo here 
     DoStuff(data); 
     button2.Click -= handler; 
    }; 
    button2.Click += handler; 
} 

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

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

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