Форма загружается неправильно
Я пытаюсь построить систему телефонных звонков на основе TAPI, используя Atapi x86 от JulMar. Одной из функций является вставка определенной формы во входящий вызов. Однако всякий раз, когда форма всплывает, она появляется неправильно, как показано ниже (я попробовал несколько форм в качестве теста, и все они делают одно и то же). Там нет ошибки, ничего в окне вывода, чтобы предложить, в чем проблема.
Код:
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 ответ
Вполне возможно, что это событие инициируется в потоке, отличном от потока пользовательского интерфейса вашего приложения.
Измените метод следующим образом, чтобы проверить, является ли это проблемой:
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
}
Это определит, что мы находимся в потоке, отличном от того, в котором была создана ваша основная форма (форма), и затем снова запустим функцию в потоке основной формы.