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 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。只有数据变化了才会导致窗口刷新。

参考技术B 我是使用设置标志位配合Timer实现,楼上的方法理论可行 未测试

winform怎么做到窗体左右2面分开?

就像网页用iframe隔开 可以左边点功能右边出现相应的页面
而winform怎么做 才能有这效果? 点左边功能右面出现相应的窗体

使用SplitContainer控件。

参考下图:

参考技术A 方法一、手动写界面(这个有点麻烦...)
方法二、或者把托好的界面分别放在不同的容器里,点击按钮时,设置相应的容器的visible 属性(true显示页面,FALSE 隐藏页面)
方法三、TabControl容器

以上是关于winform 界面上怎么做到时时检测是不是有新数据.有就刷新界面数据的主要内容,如果未能解决你的问题,请参考以下文章

如果 .xcodeproj 文件版本与 AppStore 发布的版本不同,如何检测 AppStore 上是不是有新的应用版本可用?

C# winform 在win7 下界面出错

WinForm检测用户是不是已登陆的方法--简单问题--请高手回答!

检测是不是在 WPF 和 Winforms 中的 UI 线程上

winform 运行后停留在界面改之前的样子!

java问题:怎么保存最近的N个数,新数添加的同时删除最旧的数,一直保留N个最近的数,数组可以实现吗?