2016-12-21 7 views
0

Я создаю форму Windows, где я подключаюсь к HP Quality Center OTA. Я могу войти в систему, но после выхода из системы, когда я нажимаю кнопку «Вход», предыдущий экземпляр объекта не получает повторной инициализации. Есть ли способ повторного использования одного и того же объекта или есть другой подход, который я должен принять? Вот код:C# Windows Form - как повторно использовать объект с другой кнопки Нажмите событие

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using TDAPIOLELib; 

namespace TestLab 
{ 


public partial class Form1 : Form 
{ 

    static TDConnection tdc = new TDConnection(); 
    static String qcUrl = "https://serveraddress/qcbin"; 
    static string uid; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void login_button1_Click(object sender, EventArgs e) 
    { 
     uid = Microsoft.VisualBasic.Interaction.InputBox("Enter your User ID", "User ID", " ", 0, 0); 
     string pwd1 = Microsoft.VisualBasic.Interaction.InputBox("Enter your password", "Password", " ", 0, 0); 

    //  TDConnection tdc = new TDConnection(); 
     tdc.InitConnectionEx(qcUrl); 
     tdc.Login(uid, pwd1); 

     label1.Text = " "; 
     label1.Text = uid + " logged into HPQC."; 

    } 

    private void label1_Click(object sender, EventArgs e) 
    { 

    } 

    private void logout_button1_Click(object sender, EventArgs e) 
    { 
     tdc.Logout(); 
     tdc.Disconnect(); 
     tdc = null; 
     label1.Text = " "; 
     label1.Text = uid + " logged out of HPQC."; 
    } 
} 

}

+0

Если вы установите для переменной tdc значение null, вам нужно снова вызвать новое TDConnection. Я не понимаю, почему вы прокомментировали эту строку в коде входа – Steve

+0

Привет, Стив, спасибо за отзыв. Да, на одной итерации я использовал прокомментированный код внутри функции login_button1_Click, но затем, когда я нажал кнопку выхода из системы, он не распознал объект tdc, поскольку он был вне области видимости. Поэтому я сделал tdc как статический объект вне этих двух функций. Теперь я могу войти в систему и выйти из системы в первый раз, но после выхода из системы, когда я снова нажму кнопку входа в систему и введите идентификатор и пароль, я получаю сообщение об ошибке: «System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта». – mkarim

+0

Не нужно ставить tdc, но вам нужно объявить его на глобальном уровне, чтобы использовать его в двух разных методах. – Steve

ответ

2

В коде Выход установить глобальную переменную tdc к нулю. Разумеется, это означает, что вам необходимо повторно инициализировать его по телефону new TDConnection

У вас есть два варианта.

  1. Удалить строку, которая устанавливает переменную tdc в значение null в logout . Оставьте все остальное без изменений
  2. Не инициализируйте переменную tdc на глобальном уровне, а просто каждый раз, когда вы вводите код входа и оставляете строку, которая устанавливает переменную tdc в значение null в коде выхода.

Учитывайте также, что эти объекты обычно реализуют интерфейс IDisposable. Если это совпадает с вашим классом TDConnection, то, вероятно, лучше вызвать метод Dispose в коде выхода

+0

Спасибо Стив. Первый вариант разрешил его. – mkarim

+0

Для второго варианта: если я не объявляю его как статическую переменную, как код выхода будет знать этот объект, поскольку он выходит за пределы области видимости? Спасибо за совет по методу Dispose, я считаю, что он доступен в этом API. Я проверю и буду использовать его после tdc.Disconnect(). Спасибо. – mkarim

+1

Если переменная объявлена ​​в области глобального класса, она доступна во всех методах этого класса. Static означает, что каждый экземпляр класса Form1 использует один и тот же tdc. Вам нужна только видимость декларации в разных методах, вам не нужен один и тот же экземпляр tdc во многих случаях Form1. Что произойдет, если вы удалите статическое ключевое слово? – Steve