首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

winFrom进度条有关问题

2012-04-03 
winFrom进度条问题想实现这样个进度条:主程序中执行一个任务时,弹出进度条窗体。注意,弹出窗口必须是模态对

winFrom进度条问题
想实现这样个进度条:主程序中执行一个任务时,弹出进度条窗体。注意,弹出窗口必须是模态对话框(ShowDialog)
主程序代码如下:

C# code
namespace ProcessBar{    public partial class Form1 : Form    {        private delegate void ShowProcessBarFrm(int max, int value);        private frmProcessBar myProgbar;        public Form1()        {            InitializeComponent();            myProgbar = new frmProcessBar();        }        private void button1_Click(object sender, EventArgs e)        {            Thread thread = new Thread(new ThreadStart(UpdateProgressBar));            thread.Start();            if (myProgbar != null)            {                lock (myProgbar.ProgressBar)                {                    myProgbar.ShowDialog();                }            }        }        private void UpdateProgressBar()        {            ShowProcessBarFrm p = new ShowProcessBarFrm(myProgbar.SetProgess);            int initialValue = 100;            for (int count = 0; count < initialValue; count = count + 2)            {                //myProgbar.SetProgess(initialValue, count);                p.Invoke(initialValue, count);            }        }    }}


进度条窗体代码:
C# code
public void SetProgess(int max, int value)        {            if (value <= max)            {                if (InvokeRequired)                {                    progressBar1.Maximum = max;                    progressBar1.Value = value;                    if (value == max)                    {                        progressBar1.Visible = false;                    }                    else                    {                        progressBar1.Visible = true;                    }                }            }        }


程序运行出现问题:"System.InvalidOperationException: 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。 

恳求,各位大侠指点。如何解决。之前使用弹出非模态窗体(Show)时已经实现,要求该为模态框就有问题了。
大家有什么好的方法请多提宝贵意见。

也阅读过来一些多线程实现的方法如:http://www.cnblogs.com/tannaiyin/archive/2009/04/26/1444164.html



[解决办法]
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;//设置任何线程都可访问
}
[解决办法]
用backgroundworker试试
[解决办法]
线程中不要访问界面上的东西,用委托去做
[解决办法]
Control.Invoke()
[解决办法]
delegate void UpdateProcessBarValueEventHandle(ProgressBar progressBar,int value);
void UpdateProcessBarValue(ProgressBar progressBar,int value)
{
if(progressBar.InvokeRequired)
{
UpdateProcessBarValueEventHandle d=new UpdateProcessBarValueEventHandle(UpdateProcessBarValue);
this.InVoke(d,new object{progressBar,value});
}
}


[解决办法]
探讨
delegate void UpdateProcessBarValueEventHandle(ProgressBar progressBar,int value);
void UpdateProcessBarValue(ProgressBar progressBar,int value)
{
if(progressBar.InvokeRequired)
{
UpdateProcessBa……

[解决办法]
用委托做

[解决办法]
if (InvokeRequired)
{
this.Invoke((EventHandler)delegate{


progressBar1.Maximum = max;
progressBar1.Value = value;
});
}

热点排行