VSTO - отключить Excel во время работы Async BackgroundWorker - PullRequest
0 голосов
/ 09 мая 2018

У меня есть надстройка VSTO, которую я разрабатываю для Excel. Форма позволяет пользователю запросить таблицу из базы данных и затем заполнить соответствующим образом. Ниже приведен мой код для BackGround Worker, так как вы можете видеть, что он запускает Async и отлично сообщает о прогрессе.

Моя проблема в том, что во время работы процесса пользователь может манипулировать и щелкать в Excel. Я знаю, что это точка асинхронной функции, но в этом случае это вызывает прерывание BackgroundWorker. Есть ли способ полностью отключить клики или активный лист?

private void button1_Click(object sender, EventArgs e)
{
    //run
    //this.backgroundWorker3.RunWorkerAsync();

    System.Threading.SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());

    BackgroundWorker bw = new BackgroundWorker();
    bw.WorkerReportsProgress = true;
    bw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker3_ProgressChanged);
    bw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker3_DoWork);

    bw.RunWorkerAsync();


}

private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{

    BackgroundWorker worker = (BackgroundWorker)sender;
    worker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker3_WorkerCOmpleted);
    if (!_isExtended)
    {
         oneline ol = new oneline();
         ol.buildOneline(this._wheres,worker );
    }
    else
    {
       ExtendedOneline ole = new ExtendedOneline();
        ole.buildExtendedOneline(this._wheres,worker);
    }
    //worker.ReportProgress();
     e.Result = "COMPLETE!";


 }

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Я считаю, что вы можете просто использовать:

 Globals.ThisAddIn.Application.Cursor = Excel.XlMousePointer.xlWait

// ... your BackgroundWorker Running here

 Globals.ThisAddIn.Application.Cursor = Excel.XlMousePointer.xlDefault;

или, может быть, с: Globals.ThisAddIn.Application.ScreenUpdating

0 голосов
/ 09 мая 2018

Помните, что многопоточность в VSTO, как правило, не очень хорошая идея. Однако я успешно использовал диалог прогресса ( Я начал с этого ). Вы все еще запускаете только один поток, который взаимодействует с API, так что, насколько я могу судить, все в порядке.

Вы называете это так:

ProgressDialogResult result = ProgressDialog.Execute(parent, name, () =>
{
    // do whatever
}, new ProgressDialogSettings(true, true, false));

Вы также можете использовать WdProtectionType, чтобы временно отключить редактирование (это для Word, но я думаю, что в Excel есть что-то похожее, может быть, XlProtectionType?), Но я бы не рекомендовал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...