2017-02-20 27 views
1

В моем учебном путешествии я пришел к выводу, что Visual Studio жалуется на мой путь к открытию, закрытию и удалению формы (после того, как я закончил с этим). То, как я это делаю; Visual Studio говорит мне, что:Правильно открыть, закрыть и удалить форму с помощью «использования».

i.e: «Form1 создает IDisposable Types».

Поскольку я хочу сделать это правильно; Я немного выкопал, и мне удалось немного понять, как работает «использование», и должно быть реализовано; что обеспечивает правильное удаление вещей. Wich работал как очарование для моих методов SQL базы данных (Insert, Update & Delete); где SqlConnection & SqlCommand, где создаются типы IDisposable.

Согласно некоторым недавним исследованиям: Try, Catch и, наконец, я должен быть в состоянии выполнить то же самое, что и с: «using» statement; но он также закроет форму, даже не используя ее. Также с Try, Catch, Наконец; форма закрывается, даже не используя ее, и Visual Studio будет вызывать те же сообщения «IDisposable Types».

Дальнейшие слова; после всего «использования» информации, которую я нашел; Я смог значительно улучшить свое приложение (и мой стиль кодирования); однако я не могу понять, как использовать «использование» с помощью формы ... Я могу создать экземпляр формы, но я не могу сохранить открытую форму до тех пор, пока я не покончу с ней, или пользователь не нажмет «Закрыть». Поэтому мой вопрос: как правильно это реализовать? или это вообще возможно?

Пример с использованием:

private void OpenForm1() 
{ 
    // Create a new instance of Form1 
    using (var f1 = new Form1()) 
    { 
     // Some Code Here 
    } 
    // Form1 Instance Gets Disposed at the End of the Loop Above. 
} 

Пример моего текущего (скромного) Открыть & Закрыть Форму Метода:

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

  • Открыть & Закрыть Формы
  • па данных СЭД через форм

    private Form1 f1; 
    
    public void OpenForm1(bool _Open, int _LocX, int _LocY) 
    { 
        try 
        { 
         switch (_Open) 
         { 
          case true: 
    
           // Close & Dispose "Form1" (if Opened) 
           if (f1 != null) { OpenForm1(false, 0, 0); } 
    
           // Re-Open Form1 with New Data (if Closed) 
           if (f1 == null) { f1 = new Form1(_LocX, _LocY); } 
    
           f1.Show(); 
           break; 
    
          case false: 
           if (f1 != null) { f1.Close(); f1.Dispose(); f1 = null; } 
           break; 
         } 
        } 
    
        catch (InvalidOperationException _IOE) { MessageBox.Show(_IOE.Message); } 
    } 
    

Примечание: Я знаю, что в качестве альтернативы может использовать/сделать IDisposable шаблон (которым я до сих пор не понимаю, как реализовать или использовать его на практике - просто теория до сих пор. Все мои попытки потерпели неудачу; заставляют меня быть подавленным и сомневаться, если это будет считаться хорошей практикой).

Заранее спасибо. С наилучшими пожеланиями;

+2

Этот метод 'OpenForm' довольно сложный для того, что он делает.Он полагается на побочные эффекты рекурсивного вызова себя на работу, и, несмотря на его название, его можно использовать для * закрытия * формы. Просто создайте соответствующий метод 'CloseForm'. Что касается этой ошибки, каков конкретный код ошибки? CA1001? CA1063? Или что-то другое? Возможно, вы просто жалуетесь, что не используете 'f1' в' 'Dispose'' Form1'', поэтому он не может гарантировать, что он всегда находится в распоряжении (даже если вы всегда это делаете, в другом месте). –

+0

Greetings Pieter; Он отображает CA1001. – Richard

ответ

1

Вы используете только using, когда срок службы вашей переменной заканчивается, когда ваш используемый блок выходит из сферы действия. Вы хотите, чтобы ваша форма проживала до того момента, когда она выходит из сферы действия инструкции using, поэтому вам не следует использовать блок using.

Form.Close звонит Dispose в любом случае, поэтому вам не нужно беспокоиться об этом здесь, так как закрытие формы будет обрабатывать очистку ресурсов. Единственный раз, когда вы должны позвонить Dispose на форме, если вы никогда не звонили Show.

+1

Спасибо Hoodaticus. Это немного просветило меня. Однако сообщение «IDiposable Types» остается. Это означает, что я делаю это неправильно. Хотя я называю Close или Dispose. – Richard

+0

@Richard - это предупреждение возникает из-за наличия поля IDisposable в классе, который не реализует IDisposable. Внедрите IDisposable, и вы хороши. Ему даже нечего делать. – hoodaticus

+1

Серьезно !? x) Ну, я изучаю C# на своём собственном копании здесь и там и пытаюсь сделать код по-своему очень тяжело ... Поэтому я ожидаю, что буду делать немые вопросы ... Спасибо M8; это значит, что я нахожусь на хорошем пути! Будет делать то, что вы написали. – Richard

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

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