进度栏不会在与VSTO加载项不同的表单上更新

时间:2019-02-05 08:57:20

标签: c# winforms progress-bar vsto

在按钮上单击Word VSTO加载项,我想显示带有进度栏的表单并更新其值。

即使我使用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 :(得分:0)

尽管这是使用委托的较旧样式,但您可能需要检查表单是否可用于更新。下面是较旧的代码-有些示例使用较新的语法而不要求委托-但通常说明了解决方法。

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