问题如下:
因为在窗体初始化时,需要连接服务器获得相应信息填充在Form上,所以打开窗体的过程就显得比较漫长,大家知道如果这样的话,客户在等待的过程中会不舒服,因为没有相应的提示信息告诉它要等待服务器回馈信息。
基于这个原因,我想这样做:能不能先显示窗口,然后再向服务器发送信息,同时在窗口中添加StatusStrip控件,显示当前状态(比如说我先向服务器发送获得客户的订购信息,这时StatusStrip显示状态是:获得订购信息;接着我再向服务器发送获得客户的购买订单,此时StatusStrip显示状态:获得购买订单)。这样的话界面就显得比较人性化一点。我不清楚的是:如果先显示窗口的界面,那么向服务器发送信息的函数应该写在哪?然后就是如何让StatusStrip控件根据loading事情的不同而变换状态。我之前没用过c#Winform开发,所以不太清楚细节。请高手们赐教!!谢谢!!!!
本人结贴率很高的!!
因为在窗体初始化时,需要连接服务器获得相应信息填充在Form上,所以打开窗体的过程就显得比较漫长,大家知道如果这样的话,客户在等待的过程中会不舒服,因为没有相应的提示信息告诉它要等待服务器回馈信息。
基于这个原因,我想这样做:能不能先显示窗口,然后再向服务器发送信息,同时在窗口中添加StatusStrip控件,显示当前状态(比如说我先向服务器发送获得客户的订购信息,这时StatusStrip显示状态是:获得订购信息;接着我再向服务器发送获得客户的购买订单,此时StatusStrip显示状态:获得购买订单)。这样的话界面就显得比较人性化一点。我不清楚的是:如果先显示窗口的界面,那么向服务器发送信息的函数应该写在哪?然后就是如何让StatusStrip控件根据loading事情的不同而变换状态。我之前没用过c#Winform开发,所以不太清楚细节。请高手们赐教!!谢谢!!!!
本人结贴率很高的!!
解决方案 »
- 如何实现修改用户名
- SqlDataReader dr1 = cmd1.ExecuteReader()问题
- 问一个正则表达式的意思
- 如何最快速获取vfp(foxpro)表的行数??
- 统计某表分页总数GetCount为什么这么调用?
- 各位高人请帮帮忙吧!
- WebService中关于IList的传递问题?
- 100分求教:利用SendMessage实现两个窗口互通消息!
- 快来帮帮我,今天就要解决抓取网页问题
- 无法打开web项目bbs
- 如何读取EXCEL到DataTable,需要从指定的行列读取(C#)
- 求高手帮忙!输入多条记录,想每次输入后,点击按钮,临时保存在下面表格中。再次点击按钮后表格形成新的一行。最后,一起提交到数据库。
参考下面填充DataGridView的public delegate void myDelegate();
DataTable dt; private void btnDianJia_Click(object sender, System.EventArgs e)
{
try
{
mythread = new Thread(new ThreadStart(ThreadWork));
mythread.Start();
}
catch(System.Exception ex)
{
MessageBox.Show(this,ex.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
} void ThreadWork()
{
this.dataGridDJ.CaptionText="正在查询电价数据...";
mf.statusBarPanel1.Text="正在查询电价数据...";
this.Cursor=Cursors.WaitCursor;
string shijian=this.dateTimeDianJia.DateValue;
DateTime today=DateTime.Today;
string mingcheng=this.txtMingCheng.Text;
string leibie=this.cmbBoxLiebie_DJ.SelectedValue.ToString();
PowerWeb.BLL.DianFeiDianJia.DianJia dj=new PowerWeb.BLL.DianFeiDianJia.DianJia(); if(shijian==today.ToString("yyyyMM"))
{
dt=dj.GetList(leibie,mingcheng).Tables[0];
}
else
{
dt=dj.GetListOld(leibie,mingcheng,shijian).Tables[0];
}
this.dataGridDJ.CaptionText=shijian+"电价信息 (共计条"+dt.Rows.Count.ToString()+"记录)"; dataGridDJ.BeginInvoke(new myDelegate(FillData));//异步调用(来填充)
this.Cursor=Cursors.Default;
mf.statusBarPanel1.Text="查询结束";
}
private void FillData()
{
this.dataGridDJ.DataSource=dt.DefaultView;
}
具体细节根据实际应用做修改 BackgroundWorker bgworker = new BackgroundWorker();
public Form1()
{
InitializeComponent();
} protected override void OnLoad(EventArgs e)
{
bgworker = new BackgroundWorker();
bgworker.DoWork += (bgworker_DoWork);
bgworker.ProgressChanged += (bgworker_ProgressChanged);
bgworker.WorkerReportsProgress = true;
bgworker.RunWorkerAsync();
} void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.statusStrip1.Text = e.UserState.ToString();
} void bgworker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
//获得订购信息
worker.ReportProgress(50, "获得订购信息");
//todo:GetOrderInfo(); //调试用,可有可无
Thread.Sleep(1000);
//获得购买订单
worker.ReportProgress(100, "获得购买订单");
//todo:GetOrderList(); }
换成
protected override void OnShown(EventArgs e)
void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.toolStripStatusLabel1.Text = e.UserState.ToString();
}
这样的话跟原先就没什么区别,因为虽然可以看到窗体,但窗体上的控件都是阻塞的(相当于窗体是空白的)。不知道怎么解决?
谢谢!!
public partial class FormMain : Form
{
BackgroundWorker bgworker = new BackgroundWorker();
public FormMain()
{
InitializeComponent();
ConfigInterface();
comboBoxMsgType.Items.Add("StandardMailing");
comboBoxMsgType.Items.Add("ApprovalMailing");
comboBoxMsgType.Items.Add("NotificatedTriggerMailing");
comboBoxMsgType.Items.Add("RecurringTriggerMailing");
comboBoxMsgType.SelectedIndex = 0;
comboBox2.Items.Add("None");
comboBox2.SelectedIndex = 0;
}
protected override void OnLoad(EventArgs e)
{
bgworker = new BackgroundWorker();
bgworker.DoWork += new DoWorkEventHandler(bgworker_DoWork);
bgworker.ProgressChanged += new ProgressChangedEventHandler(bgworker_ProgressChanged);
bgworker.WorkerReportsProgress = true;
bgworker.RunWorkerAsync();
}
void bgworker_DoWork(object sender, DoWorkEventArgs e)
{
BeginInvoke(new MethodInvoker(LoadUserInfo));
}
private void LoadUserInfo()
{ try
{
this.timer1.Enabled = true;
this.toolStripProgressBar1.Style = ProgressBarStyle.Marquee;
LoadInfomation[color=#FF0000]....;//这里是Load界面上控件值的代码,因为比较长而且代码运行时间场,所以没贴。[/color] }
catch (Exception Ex)
{
MessageBox.Show("ClientName Error:" + Ex.Message);
}
} private void timer1_Tick(object sender, EventArgs e)
{
if (toolStripProgressBar1.Value == toolStripProgressBar1.Maximum)
{
toolStripProgressBar1.Value = 0;
}
else if (toolStripProgressBar1.Value == 3)
{
toolStripStatusLabelInfo.Text = "Loading Site Infomation";
toolStripProgressBar1.PerformStep();
}
else if (toolStripProgressBar1.Value == 8)
{
toolStripStatusLabelInfo.Text = "Loading List Infomation";
toolStripProgressBar1.PerformStep();
}
else if (toolStripProgressBar1.Value == 18)
{
toolStripStatusLabelInfo.Text = "Loading Campaign Infomation";
toolStripProgressBar1.PerformStep();
}
else if (toolStripProgressBar1.Value == 28)
{
toolStripStatusLabelInfo.Text = "Loading Message Infomation";
toolStripProgressBar1.PerformStep();
}
else
{
//toolStripStatusLabelInfo.Text = "Loading Site Infomation";
toolStripProgressBar1.PerformStep();
}
}
}
出现的问题是:1.窗体打开后,会进入假死状态,我不是很清楚为什么会出现这种状态。等到Load信息完后,界面会恢复正常
2.我想让进度条toolStripProgressBar1随计时器时间的不同显示不同的值,可是它却丝毫不动。谢谢大家!!!
不知道为什么要用Timer??
事件处理放到OnShown里,不是OnLoad public partial class Form1 : Form
{
BackgroundWorker bgworker;
public Form1()
{
InitializeComponent();
}
protected override void OnShown(EventArgs e)
{
bgworker = new BackgroundWorker();
bgworker.DoWork += (bgworker_DoWork);
bgworker.ProgressChanged += (bgworker_ProgressChanged);
bgworker.WorkerReportsProgress = true;
bgworker.RunWorkerAsync();
} void bgworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.toolStripStatusLabel1.Text = e.UserState.ToString();
}
void bgworker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(20, "获得订购信息");
Thread.Sleep(2000);
worker.ReportProgress(40, "获得购买订单");
Thread.Sleep(2000);
worker.ReportProgress(80, "获得购买订单11111");
Thread.Sleep(2000);
worker.ReportProgress(100, "获得购买订单22222");
}
}
"Loading List Infomation";
"Loading Campaign Infomation";
"Loading Message Infomation";这些步骤,全部放到DoWork里去完成,如果你的ProgressBar要显示进度,那就在ProgressChanged去刷新
我采用bloodish的建议使用BackgroundWorker类,但还会陷入假死状态。
由于这个窗体是程序的主窗体,所以在OnShown里面写好像不起作用谢谢大家
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = DateTime.Now.ToString();
}
在窗体的load事件中:
DateTime DQDate = DateTime.Now.Date;
string DQTime = DateTime.Now.ToShortTimeString();
this.toolSDLtime.Text = DQDate.ToShortDateString() + " " + DQTime; toolSDQTime.Text = DQTime;
timer1.Interval = 10000;
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Start();
第二步:
在timer控件的事件中:
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = true;
string DQTime = DateTime.Now.ToShortTimeString ();
toolSDQTime.Text = DQTime;
}
lable控件的text属性会随着时间的改变而改变;还有一点:“将timer控件的Interval属性设为你要改变的时间间隔例如一分钟变一次该属性值为60000”