C# 如何访问progressBar?

C# 如何访问progressBar?,c#,winforms,windows-forms-designer,C#,Winforms,Windows Forms Designer,在Windows窗体上的程序中,我有一个MainForm,其中包含ProgressBar。在子窗体中我想更改它的值,但我得到一个错误: “int”不包含“Value”的定义。找不到扩展方法“Value”,使用类型为“int”的第一个参数(缺少using指令或程序集引用?) 主要形式: public int ProgressBar5 { get { return progressBar5.Value; } set { progressBar5.Value = value; } }

在Windows窗体上的程序中,我有一个MainForm,其中包含ProgressBar。在子窗体中我想更改它的值,但我得到一个错误:

“int”不包含“Value”的定义。找不到扩展方法“Value”,使用类型为“int”的第一个参数(缺少using指令或程序集引用?)

主要形式:

public int ProgressBar5
{
    get { return progressBar5.Value; }
    set { progressBar5.Value = value; }
}
static MainForm mainForm = new MainForm();

private void button1_Click(object sender, EventArgs e)
{         
    mainForm.ProgressBar5.Value++; // Error
}
private void button9_Click(object sender, EventArgs e)
{
    Child child = new Child();
    child.ShowDialog();
    MessageBox.Show(progressBar5.Value.ToString()); // All time Value = 1
}
子表单:

public int ProgressBar5
{
    get { return progressBar5.Value; }
    set { progressBar5.Value = value; }
}
static MainForm mainForm = new MainForm();

private void button1_Click(object sender, EventArgs e)
{         
    mainForm.ProgressBar5.Value++; // Error
}
private void button9_Click(object sender, EventArgs e)
{
    Child child = new Child();
    child.ShowDialog();
    MessageBox.Show(progressBar5.Value.ToString()); // All time Value = 1
}
Edit1: 在主窗体中,progressBar5的值始终等于1。原因可能是什么?我想,静态可以修复它

主要形式:

public int ProgressBar5
{
    get { return progressBar5.Value; }
    set { progressBar5.Value = value; }
}
static MainForm mainForm = new MainForm();

private void button1_Click(object sender, EventArgs e)
{         
    mainForm.ProgressBar5.Value++; // Error
}
private void button9_Click(object sender, EventArgs e)
{
    Child child = new Child();
    child.ShowDialog();
    MessageBox.Show(progressBar5.Value.ToString()); // All time Value = 1
}

您的
ProgressBar5
属性已经负责访问进度条的
属性。它不返回进度条,而是返回当前进度。这意味着调用者不需要访问结果的
属性(因为没有)

只要写下:

mainForm.ProgressBar5++;
当然,为了清楚起见,调用这样的属性
CurrentProgress
可能比调用
ProgressBar
要好,因为它不返回进度条,而是返回(或设置)当前进度


当然,更好的办法是让孩子完全不知道主要形式。子窗体可以接受
IProgress
实例,而不是传递主窗体本身。然后,它可以向创建此表单的任何人报告进度,无论该表单是您的主表单还是其他任何表单。然后,主窗体负责在报告进度时执行它想要的任何操作,它可以在事件处理程序或传递到
进度
构造函数的委托中定义该操作。

您的
进度条5
属性已经负责访问进度条的
属性。它不返回进度条,而是返回当前进度。这意味着调用者不需要访问结果的
属性(因为没有)

只要写下:

mainForm.ProgressBar5++;
当然,为了清楚起见,调用这样的属性
CurrentProgress
可能比调用
ProgressBar
要好,因为它不返回进度条,而是返回(或设置)当前进度


当然,更好的办法是让孩子完全不知道主要形式。子窗体可以接受
IProgress
实例,而不是传递主窗体本身。然后,它可以向创建此表单的任何人报告进度,无论该表单是您的主表单还是其他任何表单。然后,当报告进度时,主窗体负责执行它想要执行的任何操作,它可以在事件处理程序或传递到
进度
构造函数的委托中定义该操作。

问题是,您有两个名称相似的变量,这会造成相当多的混淆。当您尝试访问
ProgressBar5
变量时,实际上您得到的是在第一个代码段中声明的int属性

由于int没有
属性,因此会出现编译时错误。将代码更改为:

static MainForm mainForm = new MainForm();

private void button1_Click(object sender, EventArgs e)
{         
    mainForm.ProgressBar5++; // Fixed!
}

问题是您有两个名称相似的变量,这会造成相当多的混乱。当您尝试访问
ProgressBar5
变量时,实际上您得到的是在第一个代码段中声明的int属性

由于int没有
属性,因此会出现编译时错误。将代码更改为:

static MainForm mainForm = new MainForm();

private void button1_Click(object sender, EventArgs e)
{         
    mainForm.ProgressBar5++; // Fixed!
}

你也有一个叫做ProgressBar5的ProgressBar吗?你也有一个叫做ProgressBar5的ProgressBar吗?他没有两个同名的变量。提供的代码中没有名称冲突。记住C#区分大小写。如果这是VB,就会发生冲突。@Servy,在回复我的评论时,他说他有一个名为“ProgressBar5”的ProgressBar,在再次阅读了他的第一个代码片段后,我意识到他不打算与我的案例相匹配。我将编辑以修复。他没有两个同名的变量。提供的代码中没有名称冲突。记住C#区分大小写。如果这是VB,就会发生冲突。@Servy,在回复我的评论时,他说他有一个名为“ProgressBar5”的ProgressBar,在再次阅读了他的第一个代码片段后,我意识到他不打算与我的案例相匹配。我将编辑以修复。