2016-12-21 3 views
0

HP Quality Center OTAに接続するWindowsフォームを構築しています。私はシステムにログインすることができますが、ログインボタンをクリックするとログアウトした後、オブジェクトの前のインスタンスは再初期化されません。同じオブジェクトを再利用する方法はありますか、それとも別の方法がありますか?C#Windowsフォーム - 別のボタンからオブジェクトを再利用する方法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

こんにちはスティーブ、フィードバックありがとう。はい、1回の反復でlogin_button1_Click関数内でコメント付きコードを使用しましたが、ログアウトボタンをクリックすると、スコープ外だったのでtdcオブジェクトが認識されませんでした。だから私はtdcをこれら2つの機能の外にある静的オブジェクトとして作った。ログインとログアウトは初めてですが、ログインボタンを再度クリックしてログアウトした後、IDとパスワードを入力すると「System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示されます。 – mkarim

+0

tdcを静的にする必要はありませんが、2つの異なる方法で使用できるようにグローバルレベルで宣言する必要があります – Steve

答えて

2

ログアウトコードで、あなたがnullにグローバル変数tdcを設定します。ここでは、コードです。もちろんこれは、あなたがnew TDConnectionへの呼び出しでそれを再初期化する必要があることを意味します。

2つのオプションがあるようです。

  1. ログアウト コードで、tdc変数をnullに設定する行を削除します。
  2. 変数tdcをグローバルレベルで初期化しないでください。ただし、ログインコードを入力するたびに を入力し、ログアウトコードで変数tdcを設定する行をnullのままにしてください。

これらの種類のオブジェクトは、通常、IDisposableインターフェイスを実装することも考慮してください。 TDConnectionクラスと同じ場合は、ログアウトコードのDisposeメソッドを呼び出す方が良いでしょう。

+0

Thanks Steve。最初のオプションで解決しました。 – mkarim

+0

2番目のオプション:静的変数として宣言していない場合、ログアウトコードはスコープ外でそのオブジェクトをどのように認識しますか? Disposeメソッドのヒントをありがとう、私はそれがこのAPIで利用できると信じています。チェックし、tdc.Disconnect()の後で使用します。ありがとうございました。 – mkarim

+1

変数がグローバルクラスのスコープで宣言されている場合、変数はそのクラスのすべてのメソッドで使用できます。 Staticは、Form1クラスのすべてのインスタンスが同じtdcを使用することを意味します。異なるメソッドで宣言の可視性だけが必要な場合は、Form1の多くのインスタンスでtdcの同じインスタンスを用意する必要はありません。静的キーワードを削除するとどうなりますか? – Steve

関連する問題