更改动态创建的进度条的值

本文关键字:动态 创建 | 更新日期: 2023-09-27 18:24:26

我在TableLayoutPanel中动态创建了一堆文本框、标签和进度条这些我想从Parallel.Foreach线程控制。我知道每个控件的名称,所以我可以这样访问它们:

Table1.Invoke(
      new MethodInvoker(delegate() { 
                Table1.Controls[<name>].Text = "text to write"; 
      }));

但是,当我尝试更改进度条的值或尝试更改样式(blocks->marquee)时,它不知道.style选项的.value。

Table1.Invoke(
      new MethodInvoker(delegate() {
           Table1.Controls[<progressbar_name>].Value = <percentage>; 
      }));
Table1.Invoke(
      new MethodInvoker(delegate() { 
         Table1.Controls[<progressbar_name>].Style = ProgressBarStyle.Marquee; 
      }));

它给出了一个错误,即当前上下文中不能存在.Value和.Style。

更改动态创建的进度条的值

您可能希望将Table1.Controls[<progressbar_name>]强制转换为ProgressBar类。

您需要强制转换控件才能使用ProgressBar属性。

试试这个:

Table1.Invoke(new MethodInvoker(delegate()
{
    ((ProgressBar)Table1.Controls[<progressbar_name>]).Value = <percentage>;
    ((ProgressBar)Table1.Controls[<progressbar_name>]).Style = ProgressBarStyle.Marquee;
}));

很高兴能帮助你!

当您引用Table1.Controls[<progressbar_name>]时,它被解释为Control,而不是ProgressBar,后者恰好是Control的子类。

一个简单的解决方案:

var progBar = Table1.Controls[<progressbar_name>] as ProgressBar;
if(progBar != null)
{
    progBar.Value =  = <percentage>; 
}

严格来说,if结构不应该是必要的,但在某些情况下,可以通过跳过设置值的尝试来避免异常(例如,在表中的控件没有正确加载或实例化的情况下)。