namespace WindowsForm
{
public partial class Form1 : Form
{
public delegate void changeProgress(int current);
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
begin b = new begin();
b.Go();
}
public void progressChange(int current)
{
progressBar1.Value = current;
}
}
}namespace WindowsForm
{
public class begin
{
public void Go()
{
Form1 fom1 = new Form1();
WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange);
for (int i = 1; i < 100; i++)
{
Console.WriteLine(i.ToString());
cp.BeginInvoke(i, null, null);
Thread.Sleep(1);
}
} }
}
为什么滚动条没有变化。
{
public partial class Form1 : Form
{
public delegate void changeProgress(int current);
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
begin b = new begin();
b.Go();
}
public void progressChange(int current)
{
progressBar1.Value = current;
}
}
}namespace WindowsForm
{
public class begin
{
public void Go()
{
Form1 fom1 = new Form1();
WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange);
for (int i = 1; i < 100; i++)
{
Console.WriteLine(i.ToString());
cp.BeginInvoke(i, null, null);
Thread.Sleep(1);
}
} }
}
为什么滚动条没有变化。
解决方案 »
- 当传递具有已删除行的 DataRow 集合时,更新要求有效的 DeleteCommand,加分
- 请大家帮助解决一个问题
- 请教关于访问动态控件的问题
- System.Data.SqlClient.SqlException: 列名 't' 无效 菜鸟请求赐教
- 怎样才能将数据库的变动及时的反馈
- 我把从richtextbox 中取得的汉字字符写到htm 文件中,,怎么是乱码??
- 有没有使用过 oracle ODP 进行数据操作的高手请看一下
- 无法在WEB服务器上调试,不具备调试此应用程序的权限~~50分相送~~~
- session无故丢失的问题。
- 为什么我得datagrid无法显示??在线等!!
- 写了一个软件.如何才能让它一直运行?
- DataList 内如何给字段做判断
WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange); 实例化了一个Form1,应该不会再原来的画面中表示出来吧,而是在新的画面实例中吧!
在你的程序里,b.Go 的调用将主线程阻塞住了,当然不会变化了
而且,在你使用 BeginInvoke 调用 progressChange 的时候,在另一个线程中为 progressBar1.Value 赋值
不清楚 WinForm 具体是怎么规定的,但在大多数图形界面中,这种做法是有害的
例如,在 WPF 中,这种做法(在另一个线程中改变控件属性)会报错,告诉你不能这么做
WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange); 你的委托是基于一个没有show过的新form1,怎么能期待在当前的form1上体现出来效果
public void progressChange(int current)
{
this.Invoke(new MethodInvoker(delegate()
{
progressBar1.Value = current;
}));
} Begin类修改:
public class begin
{
public void Go()
{
Form1 fom1 = new Form1();
form1.Show();
WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange);
for (int i = 1; i < 100; i++)
{
Console.WriteLine(i.ToString());
//cp.BeginInvoke(i, null, null);
fom1.Invoke(cp, i);
Thread.Sleep(1);
}
} }
你begin类应该是处理数据的吧?那你的委托应该定义在begin里面
如下:
public class begin
{
public delegate void changeProgress(int current); public changeProgress changedProgressed; public void Go()
{ for (int i = 1; i < 100; i++)
{
Console.WriteLine(i.ToString());
if (changedProgressed != null)
{
changedProgressed(i);
}
Thread.Sleep(1);
}
} } 你的form里面是这样的
private void button1_Click(object sender, EventArgs e)
{
begin b = new begin();
b.changedProgressed = new begin.changeProgress(this.progressChange);
b.Go(); } public void progressChange(int current)
{
//this.Invoke(new MethodInvoker(delegate()//这里就可以不要了
//{
progressBar1.Value = current;
// }));
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(Test);
thread.Start(); } private void Test()
{
for (int i = 0; i <= 100; i++)
{
Thread.Sleep(100);
progressChange(i);
} } public delegate void ChangedHandle(int current); public void progressChange(int current)
{
if (this.progressBar1.InvokeRequired)//判断是不是在同一个线程里
{
ChangedHandle p = new ChangedHandle(progressChange);
this.progressBar1.Invoke(p, new object[] { current });
}
else
{
this.progressBar1.Value = current;
}
}