2016-12-21 3 views
0

HP Quality Center OTA에 연결할 Windows Form을 작성 중입니다. 시스템에 로그인 할 수 있지만 로그인 버튼을 클릭하면 로그 아웃 한 후 객체의 이전 인스턴스가 다시 초기화되지 않습니다. 동일한 객체를 재사용 할 수있는 방법이 있습니까? 아니면 다른 접근 방식을 취해야합니까?C# Windows Form - 다른 단추에서 개체를 다시 사용하는 방법 Click 이벤트

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 함수 내에서 주석 처리 된 코드를 사용했지만 logout 버튼을 클릭했을 때 범위를 벗어난 tdc 객체를 인식하지 못했습니다. 그래서 저는 tdc를이 두 함수 밖에서 정적 객체로 만들었습니다. 이제 로그인하고 로그 아웃 할 수 있지만 로그인 버튼을 다시 클릭하여 로그 아웃 한 후 ID와 비밀번호를 입력하면 "System.NullReferenceException : 객체 참조가 객체의 인스턴스로 설정되지 않았습니다."오류가 발생합니다. – mkarim

+0

tdc를 정적으로 만들 필요는 없지만 두 가지 다른 방법으로 사용할 수 있으려면 전역 수준에서 선언해야합니다. – Steve

답변

2

로그 아웃 코드에서 당신이 null로 전역 변수 tdc을 설정 : 여기에 코드입니다. 물론 이것은 다시 호출해야 함을 의미합니다. new TDConnection

두 가지 옵션이있는 것 같습니다.

  1. 로그 아웃 코드에서 tdc 변수를 null로 설정하는 행을 제거하십시오.
  2. 전역 수준에서 변수 tdc를 초기화하지 말고 로그인 코드를 입력 할 때마다 을 입력하고 로그 아웃 코드에서 변수 tdc를 설정하는 행을 null로 두십시오.

또한 이러한 종류의 개체는 일반적으로 IDisposable 인터페이스를 구현한다고 생각하십시오. TDConnection 클래스와 동일하면 로그 아웃 코드에서 Dispose 메서드를 호출하는 것이 더 좋습니다.

+0

Thanks Steve. 첫 번째 옵션으로 해결되었습니다. – mkarim

+0

두 번째 옵션 : 정적 변수로 선언하지 않으면 범위를 벗어난 로그 아웃 코드는 어떻게 알 수 있습니까? Dispose 메서드에 대한 팁 주셔서 감사합니다,이 API에서 사용할 수 있다고 생각합니다. 나는 tdc.Disconnect()를 체크하고 그것을 사용할 것이다. 고맙습니다. – mkarim

+1

변수가 전역 클래스 범위에서 선언 된 경우 해당 클래스의 모든 메서드에서 변수를 사용할 수 있습니다. Static은 Form1 클래스의 모든 인스턴스가 동일한 tdc를 사용함을 의미합니다. 다른 메서드에서 선언에 대한 가시성 만 있으면되므로 Form1의 많은 인스턴스에서 tdc의 동일한 인스턴스가 필요하지 않습니다. 정적 키워드를 제거하면 어떻게됩니까? – Steve