C# 如何访问progressBar?
在Windows窗体上的程序中,我有一个MainForm,其中包含ProgressBar。在子窗体中我想更改它的值,但我得到一个错误: “int”不包含“Value”的定义。找不到扩展方法“Value”,使用类型为“int”的第一个参数(缺少using指令或程序集引用?) 主要形式: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; } }
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,在再次阅读了他的第一个代码片段后,我意识到他不打算与我的案例相匹配。我将编辑以修复。