表格未正确加载

时间:2016-05-16 11:19:33

标签: c# winforms tapi

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

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

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

编辑:

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

1 个答案:

答案 0 :(得分: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
}

这将标识我们所处的线程与您创建的主窗体(窗体)不同,然后在主窗体的线程上再次执行该函数。