winform 界面上怎么做到时时检测是不是有新数据.有就刷新界面数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform 界面上怎么做到时时检测是不是有新数据.有就刷新界面数据相关的知识,希望对你有一定的参考价值。
我现在用Timer每秒刷新,这样的话.切换选项卡界面就不流畅了..有没什么好办法解决..
我简单做了一个程序,用于给楼主一些思路。以下代码可以新建winform工程后直接粘贴到Form1.cs文件里去执行。画面上拖两个textbox控件,分别命名为txtold,txtnew。
运行效果是,在txtold输入值时,txtnew可以时时显示txtold的数据。
做法是,不使用textbox自带的textchanged事件,而是用线程和委托给txtnew赋值,
避免了你使用timer控件每秒刷新造成画面卡顿的效果。
PS:时时刷新时,不建议时时从数据库取值,效率很低,还影响服务器的速度,用户体验不好
切记切记
具体实现方式看以下代码,注意有 //*****标记的那几行注释。
=============================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace refresh
public partial class Form1 : Form
private Thread m_tRefresh;
public Form1()
InitializeComponent();
/// <summary>
/// 画面加载时
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(EventArgs e)
base.OnLoad(e);
//开启一个时时刷新数据的线程
m_tRefresh = new Thread(new ThreadStart(refreshData));
m_tRefresh.Start();
/// <summary>
/// 获取画面当前是否正在关闭的flag
/// </summary>
private bool m_IsOnClosing = false;
/// <summary>
/// 画面关闭时
/// </summary>
/// <param name="e"></param>
protected override void OnClosing(CancelEventArgs e)
base.OnClosing(e);
//画面关闭事件正在执行时把m_IsOnClosing设为true
m_IsOnClosing = true;
//如果画面关闭时线程还开启,那么把他关掉
if (m_tRefresh.IsAlive)
m_tRefresh.Abort();
/// <summary>
/// 线程执行的时时刷新数据的函数
/// </summary>
private void refreshData()
//while true,达到时时的目的
while (true)
try
//*****判断新txtbox和旧txtbox的值是否一样,不一样的话,把旧的值赋给新的
//*****在这里只是用两个文本框举例,你可以换成其他的,
//*****例如周期从其他类里取值,周期从其他画面取值,周期从数据库取值,等等
//*****但时时刷新时,不建议时时从数据库取值,效率很低,还影响服务器的速度,用户体验不好
if (txtnew.Text != txtold.Text)
if (txtnew.InvokeRequired)
//如果给txtnew设值时是在线程中,那么使用委托给他赋值
SetTextCallback s = SetText;
txtnew.Invoke(s, txtold.Text);
else
//如果不在线程中,那么直接赋值
txtnew.Text = txtold.Text;
catch (Exception ex)
//一些例外处理
if (!m_IsOnClosing)
MessageBox.Show(ex.ToString());
else
if (m_tRefresh.IsAlive)
m_tRefresh.Abort();
break;
/// <summary>
/// 给txtbox设值的委托
/// </summary>
/// <param name="text"></param>
delegate void SetTextCallback(string text);
/// <summary>
/// 设值函数
/// </summary>
/// <param name="text"></param>
private void SetText(string text)
text = text.Replace("\0", "");
if (txtnew.InvokeRequired)
SetTextCallback s = SetText;
txtnew.Invoke(s, text);
else
txtnew.Text = text;
追问
如果不时时检测数据库,就不知道数据库有没新数据呀..我现在是界面第一次加载会把最新的那条数据ID保存到临时变量的..每次TIMER的时候判断是否跟这个相等.相等就绑定数据.不相等不绑定..
但每次TIMER会去查询数据库数据呀..
实在要查数据库的话,我建议是做成连接池吧,这样会好一些。
参考技术A最直接的方法是利用事件通知窗体刷新数据。大致的思路如下:
将要显示的数据封装到类中
class DisplayDatapublic DisplayData(int x)
this.x = x;
//假设x是需要在界面上显示的数据
private int x;
pubilc int X
get return this.x;
set
if( value == this.x ) return;
this.x = value;
//x的值发生变化,引发事件,通知界面刷新
if (this.DataChanged != null) DataChanged(this, EventArgs.Empty);
//数据变化事件
public EventHandler<EventArgs> DataChanged
在Winform中,利用DisplayData中的DataChanged事件进行刷新
DisplayData dd;
public Form1()
InitializeComponent();
dd = new DisplayData(10);
this. textBox1.Text = dd.X.ToString();
//数据更新事件处理
dd.DataChanged += UpdateData;
private void UpdateData(object sender, EventArgs e)
//数据已经更新,刷新界面显示
this. textBox1.Text = dd.X.ToString();
以上思路的特点是:当数据发生变化,将数据变化主动“推送”到Winform。只有数据变化了才会导致窗口刷新。
winform怎么做到窗体左右2面分开?
就像网页用iframe隔开 可以左边点功能右边出现相应的页面
而winform怎么做 才能有这效果? 点左边功能右面出现相应的窗体
使用SplitContainer控件。
参考下图:
参考技术A 方法一、手动写界面(这个有点麻烦...)方法二、或者把托好的界面分别放在不同的容器里,点击按钮时,设置相应的容器的visible 属性(true显示页面,FALSE 隐藏页面)
方法三、TabControl容器
以上是关于winform 界面上怎么做到时时检测是不是有新数据.有就刷新界面数据的主要内容,如果未能解决你的问题,请参考以下文章
如果 .xcodeproj 文件版本与 AppStore 发布的版本不同,如何检测 AppStore 上是不是有新的应用版本可用?
WinForm检测用户是不是已登陆的方法--简单问题--请高手回答!