表单加载不正确

Form not loading correctly

我正在尝试使用 JulMar 的 Atapi x86 构建基于 TAPI 的 phone 调用系统。其中一个功能是在呼入时弹出一个特定的表单。但是,每当弹出表单时,它都会出现错误,如下所示(我尝试了几种表单作为测试,它们都做同样的事情)。没有错误,输出中没有任何内容 window 表明问题所在。

代码:

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);
        }
    }

我在其他地方加载了这个函数之外的这些表单,这意味着它与这个函数有关。有人知道我哪里错了吗?

编辑:

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

这些函数已经在别处测试过,并且可以单独正常工作,我相信它可能与 TAPI 相关。

编辑 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
            }
        }
    }

此事件可能是在与您应用程序的 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
}

这将确定我们处于与创建主窗体(窗体)不同的线程中,然后在主窗体的线程上再次执行该函数。