Индикатор выполнения, С#

В настоящее время я работаю над приложением, в котором есть несколько веб-браузеров на вкладке с индикаторами выполнения. Чтобы избавить меня от дублирования кода, я хотел создать метод, в котором я передаю имя индикатора выполнения в функцию. Я создал следующее ниже, но я получаю эту ошибку.

«строка» не содержит определения для «Максимум», и не удалось найти метод расширения «Максимум», принимающий первый аргумент типа «строка» (вам не хватает директивы использования или ссылки на сборку?)

  private void PassPBName(string PBName)
        {

            // Event for the browser
            AxSHDocVw.DWebBrowserEvents2_ProgressChangeEvent e;

            /* The CurrentProgress variable from the raised event
                  * gives you the current number of bytes already downloaded
                  * while the MaximumProgress is the total number of bytes
                  * to be downloaded */
            if (e.progress < e.progressMax)
            {
                // Check if the current progress in the progress bar
                // is >= to the maximum if yes reset it with the min
                if (PBName.Value >= PBName.Maximum)
                    PBName.Value = PBName.Minimum;
                else
                    // Just increase the progress bar
                    PBName.PerformStep(); 
            }
            else
                // When the document is fully downloaded
                // reset the progress bar to the min (0)
                PBName.Value = PBName.Minimum;
        }
        private void WBIntranet_ProgressChange(object sender, AxSHDocVw.DWebBrowserEvents2_ProgressChangeEvent e)
        {

            string progressBar = PBIntranet.Value.ToString();
            PassPBName(progressBar);
        }

Спасибо


person Steve    schedule 02.07.2010    source источник


Ответы (4)


Если вы отправляете имя индикатора выполнения, вам нужно использовать что-то вроде метода FindControl, чтобы найти элемент управления. Вместо этого лучше отправить ссылку на элемент управления progressbar:

private void PassPBReference(ProgressBar PBName) {
  ...
}

и вызовите его, используя только:

PassPBReference(PBIntranet);

(Конечно, вы должны придумать лучшее имя для метода, которое отражает то, что он делает, а не только то, как вы передаете ему параметры.)

person Guffa    schedule 02.07.2010

У вас есть строка с именем PBName, но вы используете ее, как если бы это был класс индикатора выполнения. Возможно, вы хотели пропустить урок? Предполагая, что PBIntranet является фактическим классом индикатора прогресса, похоже, вы должны передать его в свою функцию PassPBName. Просто предполагаю, что вам также нужно передать e из вашего события WBIntranet_ProgressChange, а не локально объявлять другое в PassPBName, что, я не думаю, сработает так, как вы предполагали.

person dsolimano    schedule 02.07.2010

Вы не можете сослаться на объект, просто указав его имя в переменной. Вам нужно будет получить к нему доступ через Reflection. Что-то вроде этого:

Using System.Reflection;

ProgressBar myProgress = (ProgressBar)this.GetType().GetField(PBName).GetValue(this);

Я немного поверхностен в синтаксисе, но, возможно, это поможет вам продвинуться дальше. Когда у вас есть фактический объект, вы можете получить доступ к параметрам Максимум/Минимум/и т.д.

person Fosco    schedule 02.07.2010

Я нашел решение, если кто-то еще хочет знать, как это сделать.

private void PassPBName(ToolStripProgressBar PBName, AxSHDocVw.DWebBrowserEvents2_ProgressChangeEvent e)
    {
              /* The CurrentProgress variable from the raised event
              * gives you the current number of bytes already downloaded
              * while the MaximumProgress is the total number of bytes
              * to be downloaded */
        if (e.progress < e.progressMax)
        {
            // Check if the current progress in the progress bar
            // is >= to the maximum if yes reset it with the min
            if (PBName.Value >= PBName.Maximum)
                PBName.Value = PBName.Minimum;
            else
                // Just increase the progress bar
                PBName.PerformStep();
        }
        else
            // When the document is fully downloaded
            // reset the progress bar to the min (0)
            PBName.Value = PBName.Minimum;
    }

    private void WBIntranet_ProgressChange(object sender, AxSHDocVw.DWebBrowserEvents2_ProgressChangeEvent e)
    {

        //Pass the PB bar name to PassPBName function to show current progress.
         PassPBName (PBIntranet, e);
    }
person Steve    schedule 06.07.2010