Winform添加正在加载请稍后功能

itliyi 2009-07-10 01:18:55
如题,winform中,数据加载慢,想弄个正在加载请稍后。。。用的是panel,里面放入一个lable和一个picturebox提示正在读取,问题是怎么显示出来的时候像卡住一样,消失后数据已经读取出来了,请叫高手怎么实现,或给个思路,是否涉及多线程?
顺便问下怎么让panel改变透明度
我是重载的控件

public class Class1:System.Windows.Forms.Panel
{
protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs e)
{
if (this.Parent.BackgroundImage == null || this.Parent == null)
{
base.OnPaintBackground(e);
}
else
{
e.Graphics.DrawImage(this.Parent.BackgroundImage, 0, 0,
new Rectangle(this.Location.X, this.Location.Y, this.Width, this.Height),
System.Drawing.GraphicsUnit.Pixel);


}
}
}
...全文
2626 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhaiwen001 2010-05-07
  • 打赏
  • 举报
回复
怎么样啊,不会阿

<script type="text/javascript"><!--
google_ad_client = "pub-6801609417141055";
/* 728x90, 创建于 10-5-6 */
google_ad_slot = "7731452172";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
dyrne 2009-09-18
  • 打赏
  • 举报
回复
不用委托的话,在线程里没法调用啊,楼上的
风之影子 2009-07-10
  • 打赏
  • 举报
回复
以上启用了委托(算是多此一举)

你可以直接用线程来调用
风之影子 2009-07-10
  • 打赏
  • 举报
回复
delegate void HandleInterfaceUpdateDelegate(); //委托,此为重点
HandleInterfaceUpdateDelegate interfaceUpdateHandle;
Thread td;
public formMain()
{
InitializeComponent();
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(StartPro); //实例化委托对象
}



在你进行操作的方法里第一句加上:
this.Invoke(interfaceUpdateHandle);//用指定的参数列表执行指定的委托

最后一行加上:
td.Abort();


这是相关的方法。
private void chang()
{
ProcessBar obj = new ProcessBar();注:ProcessBar是你放置图片的窗口
obj.ShowDialog();
}


public void StartPro()
{
td= new Thread(chang);
td.Start();
}
Myth_NiuNiu 2009-07-10
  • 打赏
  • 举报
回复
路过顶下
chinagns 2009-07-10
  • 打赏
  • 举报
回复
我说你还没搞出来啊?
itliyi 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hecker728 的回复:]
异步读取数据
[/Quote]

异步不行 试过
itliyi 2009-07-10
  • 打赏
  • 举报
回复
363040367 在线请教 呵呵
hecker728 2009-07-10
  • 打赏
  • 举报
回复
异步读取数据
hxily 2009-07-10
  • 打赏
  • 举报
回复


学习
微醺_zZ 2009-07-10
  • 打赏
  • 举报
回复

static void Main()
{
SkinManager.EnableMdiFormSkins();
SkinManager.EnableFormSkins();

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

welcome wel = new welcome();
wel.Show();
context = new ApplicationContext();
context.Tag = wel;
Application.Idle += new EventHandler(Application_Idle); //注册程序运行空闲去执行主程序窗体相应初始化代码
Application.Run(context);

//WFMain main = XtraFormFactory.CreateMdiForm<WFMain>();
//Application.Run(main);
}

//初始化等待处理函数
private static void Application_Idle(object sender, EventArgs e)
{
Application.Idle -= new EventHandler(Application_Idle);
if (context.MainForm == null)
{
WFMain main = XtraFormFactory.CreateMdiForm<WFMain>();
context.MainForm = main;
main.init(); //主窗体要做的初始化事情在这里,该方法在主窗体里应该申明为public
welcome sp = (welcome)context.Tag;
sp.Close(); //关闭启动窗体
main.Show(); //启动主程序窗体
}
}
chinagns 2009-07-10
  • 打赏
  • 举报
回复
在主窗体数据操作的时候,用一个线程开启进度等待子窗体。 其中数据操作也要用另外一个线程。 在主窗体中对数据操作结果做判断。

也就是说一共3个线程。

主窗体一个线程 循环检查数据处理结果,给你的例子是10秒超时

等待子窗体一个线程 等待主窗体数据判断后的指示

数据操作一个线程 数据操作,返回主窗体结果

懂了吗?
itliyi 2009-07-10
  • 打赏
  • 举报
回复
你是说读取数据的时候窗体new出来?
chinagns 2009-07-10
  • 打赏
  • 举报
回复
呵呵 有的。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Window.Forms;
using System.Threading;
using System.Net;
using System.IO;

MyProgressBar是你新建的窗体,作为主窗体的子窗体。 不可能没有的
yingzhilian2008 2009-07-10
  • 打赏
  • 举报
回复
backgroundworker
itliyi 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chinagns 的回复:]
简单的多线程,给你写个简单的例子吧。

1.首先新建一个程序进度窗体。 叫做 ProgressBar 好了。在这个窗体里,你可以设计视图添加进度条等等。然后定义一个状态变量

ProgressBar MyProgressBar = new ProgressBar();
Thread MyProgressWait;
Bool DataOperate_Finished = false;

private void ProgressBarWait()
{
MyProgressBar = new ProgressBar();
MyProgressBar.MdiParent = this.MdiParent;
MyProgressBar.ShowDialog();

if(MyProgressBar.DialogResult == DialogResult.OK)
{
//如果数据加载正确的逻辑
}
else
{
//数据加载错误的逻辑
}

MyProgressBar.Dispose();
MyProgressBar.Close();
}

...好,现在是主线程的逻辑了

private void MainThread()
{
MyProgressWait = new Thread(new ThreadStart(ProgressBarWait));
MyProgressWait.Start();
//上面启动进度窗口线程


//这里是你的主线程数据处理逻辑。如果数据处理完成,DataOperate_Finished 变量置 true

int TCounter = 0;
while(TCounter <= 200 && DataOperate_Finished == false)
{
TCounter++;
Thread.Sleep(50);
}

if(DataOperate_Finished == true)
{
this.MyProgressBar.DialogResult = DialogResult.OK;
DataOperate_Finished == false;
}
else
{
this.MyProgressBar.DialogResult = DialogResult.No;
MessageBox.Show("错误信息");
}
}


[/Quote]

if(MyProgressBar.DialogResult == DialogResult.OK)
{
//如果数据加载正确的逻辑
}
没有DialogResult属性吧?
itliyi 2009-07-10
  • 打赏
  • 举报
回复
呵呵 谢谢 我再试
chinagns 2009-07-10
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_5594da4d0100eh81.html
chinagns 2009-07-10
  • 打赏
  • 举报
回复
简单的多线程,给你写个简单的例子吧。

1.首先新建一个程序进度窗体。 叫做 ProgressBar 好了。在这个窗体里,你可以设计视图添加进度条等等。然后定义一个状态变量

ProgressBar MyProgressBar = new ProgressBar();
Thread MyProgressWait;
Bool DataOperate_Finished = false;

private void ProgressBarWait()
{
MyProgressBar = new ProgressBar();
MyProgressBar.MdiParent = this.MdiParent;
MyProgressBar.ShowDialog();

if(MyProgressBar.DialogResult == DialogResult.OK)
{
//如果数据加载正确的逻辑
}
else
{
//数据加载错误的逻辑
}

MyProgressBar.Dispose();
MyProgressBar.Close();
}

...好,现在是主线程的逻辑了

private void MainThread()
{
MyProgressWait = new Thread(new ThreadStart(ProgressBarWait));
MyProgressWait.Start();
//上面启动进度窗口线程


//这里是你的主线程数据处理逻辑。如果数据处理完成,DataOperate_Finished 变量置 true

int TCounter = 0;
while(TCounter <= 200 && DataOperate_Finished == false)
{
TCounter++;
Thread.Sleep(50);
}

if(DataOperate_Finished == true)
{
this.MyProgressBar.DialogResult = DialogResult.OK;
DataOperate_Finished == false;
}
else
{
this.MyProgressBar.DialogResult = DialogResult.No;
MessageBox.Show("错误信息");
}
}

HDNGO 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhaozhijun0207 的回复:]
引用 5 楼 hdngo 的回复:
http://download.csdn.net/source/835515

winform用BackgroudWoker异步显示进度条

HDNGO,你太黑了,还要下载分
[/Quote]

默认的分数,懒得改罢了~

加载更多回复(8)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧