2016-05-16 21 views
1

JulMarのAtapi x86を使用してTAPIベースの電話システムを構築しようとしています。関数の1つは、インバウンドコールで特定のフォームをポップすることです。しかし、フォームがポップすると、下に示すように、正しく表示されません(私はいくつかのフォームをテストとして試してみて、同じことをしています)。エラーはありません。出力ウィンドウに何が問題なのかを示唆するものはありません。フォームが正しく読み込まれない

Form when I try to load

コード:

private void incomingcall(object sender, NewCallEventArgs e) 
    { 
     string phonenumber = e.Call.CallerId; //get the phone number of the call 
     SqlCommand getincoming = new SqlCommand(Querystrings.getincomingquery(), DB); 
     getincoming.Parameters.AddWithValue("@@TELEPHONE", phonenumber); 
     DataTable results = new DataTable(); 
     try 
     { 
      DB.Open(); 
      using (var results = getincoming.ExecuteReader()) 
      { 
       results.Load(results); 
      } 
     } 
     catch (Exception ex) 
     { 
      Inbound ib = new Inbound(phonenumber, null); 
      ib.Show(); 
     } 
     finally 
     { 
      DB.Close(); 
     } 
     if (results.Rows.Count == 1) 
     { 
      loadcontactrequest(Convert.ToInt32(results.Rows[0].ItemArray[0]), phonenumber); 
     } 
     else 
     { 
      loadinbound(phonenumber, results); 
     } 
    } 

私はこの機能に何かある意味、他の点では、この関数の外でこれらのフォームをロードしています。誰が私が間違っているのか分かっていますか?

EDIT:

private void loadcontactrequest(int ContactID, string phonenumber) 
    { 
     ContactRequest cr = new ContactRequest(ContactID, Global.loginbound("Single customer found", phonenumber)); 
     cr.Show(); 
    } 

これらの機能は、他の場所でテストされ、個別に正常に動作してきた、私はそれがTAPI関連するかもしれないと考えています。

EDIT 2 - 委任:

public static void inittapi() 
    { 
     if (TestOptions.notapi) 
      return; 
     tapi = new TapiManager("Omitted"); 
     tapi.Initialize(); 
     foreach (TapiLine ad in tapi.Lines) //Get all lines available to this PC 
     { 
      if (ad.Name.ToUpper().Contains("Omitted")) 
      { 
       phoneline = ad; 
       phoneline.Open(MediaModes.All); //Open the phone line for making and receiving calls 
       phoneline.NewCall += new EventHandler<NewCallEventArgs>(new TAPI().incomingcall); //Add the incoming call event handler 
      } 
     } 
    } 
+0

'loadcontactrequest()'がフォームを開いていると仮定しますか?もしそうなら、そこに問題がある可能性があります。そのコードを表示します。 – DonBoitnott

+0

このフォームをデバッグしましたか? –

+0

あなたはそれをデバッグするとどうなりますか? – AnthonyLambert

答えて

1

それは、このイベントは、アプリケーションのUIスレッドとは異なるスレッド上でトリガされている可能性があります。

これが問題であるかどうかをテストするには、このような方法を変更します。

private void incomingcall(object sender, NewCallEventArgs e) 
{ 
    Form form; 

    if(Application.OpenForms.Count > 0) 
    { 
      form = Application.OpenForms[0]; 
    } 

    if (form != null && form.InvokeRequired) 
    { 
      form.BeginInvoke(new Action(() => { incomingcall(sender, e); })); 
      return; 
    } 

    // Your current code goes here 
} 

これはあなたのメインフォーム(フォームが)上で作成されたよりも、私たちは別のスレッドであることを確認し、再度関数を実行しますメインフォームのスレッドに表示されます。

+0

コードは別のクラスにあります。そのコードはコンパイル時エラーをスローしています:\t 'TAPI'には 'InvokeRequired'の定義がなく、 'TAPI'タイプの最初の引数を受け入れる拡張メソッド 'InvokeRequired'が見つかりませんでした(usingディレクティブまたはアセンブリの参照?) –

+0

クラスには、メインフォームまたは他のオープンフォームを参照できるものがありますか?そして、代わりにこれを使用してください。または、Application.OpenForms [0] – NineBerry

+0

を使用すると、問題は解決しました。私はUIがメインスレッドから呼び出されなければならないことを認識しませんでした。ありがとう:) –

関連する問題