Индикатор выполнения не обновляется отдельно от дополнения VSTO - PullRequest
0 голосов
/ 05 февраля 2019

При нажатии кнопки в Word VSTO addin, я хочу показать форму с индикатором выполнения и обновить ее значение.

Несмотря на то, что я использовал BackgroundWorker и его события (DoWork, ProgressChanged), прогресс индикатора выполнения не обновляется соответственно

private void extractDataButton_Click(object sender, RibbonControlEventArgs e)
{
    //On button click of addin
    ProgressNotifier progressNotifier = new ProgressNotifier();
    progressNotifier.Show();
    progressNotifier.UpdateProgressBar(10);  

    // Does the work which lasts few seconds
    HandleRetrievedData(data);
    progressNotifier.UpdateProgressBar(100);
    progressNotifier.Close();
}



// Progress bar form
public partial class ProgressNotifier : Form
{
    public ProgressNotifier()
    {
        InitializeComponent();
    }

    public void UpdateProgressBar(int progress)
    {   
        backgroundWorker1.ReportProgress(progress);
        progressBar_extractionProgress.Update();
    }

    private void backgroundWorker1_ProgressChanged(object sender, 
      ProgressChangedEventArgs e)
    {
        this.progressBar_extractionProgress.Value = e.ProgressPercentage;
    }
} 

1 Ответ

0 голосов
/ 06 февраля 2019

Хотя это более старый стиль с использованием делегатов, вам может потребоваться проверить, доступна ли форма для обновления.Ниже приведен более старый код - есть примеры использования нового синтаксиса, не требующего делегатов, - но, как правило, он иллюстрирует решение.

    private delegate void StatusMessage();

    /// <summary>
    ///     Simple methods for setting active cube list before connecting
    /// </summary>
    private void SetDefaultNode()
    {
        if (this.ActiveCubeStatus.InvokeRequired)
        {
            StatusMessage d = new StatusMessage(SetDefaultNodeDirect);
            this.Invoke(d);
        }
        else
        {
            SetDefaultNodeDirect();
        }
    }

    /// <summary>
    ///     Simple methods for setting active cube list before connecting
    /// </summary>
    private void SetDefaultNodeDirect()
    {
        //clears treeveiw
        ClearActiveCubes();

        //create default inactive node
        TreeNode nodeDefault = new TreeNode();
        nodeDefault.Name = "Waiting";
        nodeDefault.Text = "Waiting on connection...";
        this.ActiveCubeStatus.Nodes.Add(nodeDefault);
        nodeDefault = null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...