winform 界面上怎么做到时时检测是否有新数据.有就刷新界面数据

我现在用Timer每秒刷新,这样的话.切换选项卡界面就不流畅了..有没什么好办法解决..... 我现在用Timer每秒刷新,这样的话.切换选项卡界面就不流畅了..有没什么好办法解决.. 展开
 我来答
IoSaber
2013-10-16
知道答主
回答量:5
采纳率:0%
帮助的人:7.1万
展开全部
我简单做了一个程序,用于给楼主一些思路。以下代码可以新建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会去查询数据库数据呀..
追答
实在要查数据库的话,我建议是做成连接池吧,这样会好一些。
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
freeeeeewind
2013-10-15 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1346万
展开全部

最直接的方法是利用事件通知窗体刷新数据。大致的思路如下:

将要显示的数据封装到类中

class DisplayData
{
   public 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事件进行刷新

public partial class Form1 : Form
{
    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。只有数据变化了才会导致窗口刷新。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
2580469282
2013-10-16 · TA获得超过247个赞
知道小有建树答主
回答量:725
采纳率:50%
帮助的人:419万
展开全部
我是使用设置标志位配合Timer实现,楼上的方法理论可行 未测试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式