winform 中更新数据时用timer控件,怎么让他不删屏?在线等待,急!

胡月王王今 2012-01-13 10:30:42
我用listview绑定数据,要实现自动刷新,现在我用了一个timer控件来控制,时间设置的是1秒,
但是现在每秒都会闪动下窗体,这样效果不好,怎么能让他不闪动呢?
...全文
320 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
li461636172 2013-08-27
  • 打赏
  • 举报
回复
17楼那个有用,我也试了下,效果比较好!谢谢!
ivanho 2012-01-13
  • 打赏
  • 举报
回复
建议你使用“datagridview”控件进行数据绑定。可能闪烁的效果会不明显。

还有就是把定时的间隔调长点。。。那就可以看得舒服点。。。

还有就是:在用“datagridview”控件进行数据绑定时,试试用这段:


private void display(DataTable dataTable, DataGridView dataGridView1)
{
if (dataTable != null)
{
SetDvSty(dataGridView1);//设置列头名称;
dataGridView1.AutoGenerateColumns = false;//是否自动绑定列,若想显示某列,只要在DataGridView中添加对应列;
dataGridView1.DataSource = dataTable.DefaultView;

}
}

private void SetDvSty(DataGridView dataGridView1)
{
//这是设定列头:
dataGridView1.Columns[0].HeaderText = "编号";
dataGridView1.Columns[0].Width = 95;
dataGridView1.Columns[1].HeaderText = "种类";
dataGridView1.Columns[1].Width = 40;
dataGridView1.Columns[2].HeaderText = "号码";
dataGridView1.Columns[2].Width = 60;
dataGridView1.Columns[3].HeaderText = "流程状态";
dataGridView1.Columns[3].Width = 80;
dataGridView1.Columns[4].HeaderText = "所属队列";
dataGridView1.Columns[4].Width = 83;
dataGridView1.Columns[5].HeaderText = "上传时间";
dataGridView1.Columns[5].Width = 120;
dataGridView1.Columns[6].HeaderText = "经办人";
dataGridView1.Columns[6].Width = 70;
}



另外还有就是在"datagridview"里边添加足够的列,把列的DataPropertyName属性,设成与你数据库字段同名(注意大小写,因为这关系到你要是想从"datagridview"行里抽值);
EnForGrass 2012-01-13
  • 打赏
  • 举报
回复
这个用到线程貌似都有闪烁问题
胡月王王今 2012-01-13
  • 打赏
  • 举报
回复
sola040515 ,结贴了
胡月王王今 2012-01-13
  • 打赏
  • 举报
回复
谢谢楼上的回复,我试了,闪屏效果没以前那么明显了,但是到时间后滚动条那里还是会闪动下。
不过还是谢谢啦!
sola040515 2012-01-13
  • 打赏
  • 举报
回复
测试代码:一个listview,一个timer
 private void Form1_Load(object sender, EventArgs e)
{
ListViewLoad();
listView1.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(listView1, true, null);//这句有注释和没注释效果很明显
timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
listadd();
}

public void listadd()
{
ListViewItem lvi;
listView1.Items.Clear();
for (int i = 0; i < 20; i++)
{
lvi = new ListViewItem((listView1.Items.Count + 1).ToString());
lvi.SubItems.Add(i.ToString());
lvi.SubItems.Add((i + 1).ToString());
lvi.SubItems.Add((i + 2).ToString());
listView1.Items.Add(lvi);
}
}
/// <summary>
/// 绘制listview框架
/// </summary>
public void ListViewLoad()
{
//繪出listview的框架
listView1.GridLines = true;//显示行与行之间的分隔线
listView1.FullRowSelect = true;//要选择就是一行
listView1.View = View.Details;//定义列表显示的方式
listView1.Scrollable = true;//需要时候显示滚动条
listView1.MultiSelect = false; // 不可以多行选择
listView1.HeaderStyle = ColumnHeaderStyle.Clickable;
}
sola040515 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 huqin8023 的回复:]
11楼的朋友,我现在用的是线程控制每隔一段时间刷新一次,刚把你那句代码复制过去了还是不行,
莫非不适用线程中!
[/Quote]我自己做的项目中就有用到timer来刷新,而且是刷新N多个动态创建的button,都是靠这句代码解决闪烁问题
胡月王王今 2012-01-13
  • 打赏
  • 举报
回复
11楼的朋友,我现在用的是线程控制每隔一段时间刷新一次,刚把你那句代码复制过去了还是不行,
莫非不适用线程中!
hui717 2012-01-13
  • 打赏
  • 举报
回复
winform下面要闪,还真不好解决.
sola040515 2012-01-13
  • 打赏
  • 举报
回复
改下
listView1.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(listView1, true, null);
sola040515 2012-01-13
  • 打赏
  • 举报
回复
listview.GetType.GetProperty("DoubleBuffered",BindingFlags.Instance | BindingFlags.NonPublic).SetValue(listview,true,null);

这句代码还蛮有用的 适用于各种控件,panel这类的闪烁我都是靠这句解决的,希望能帮到你
wzz80 2012-01-13
  • 打赏
  • 举报
回复
在dategridview 后面加一个pictruebox控件,就不闪了
胡月王王今 2012-01-13
  • 打赏
  • 举报
回复
谢谢上面的回答,不过我是新手,很少接触winform的项目,
刚刚改成了线程控制,但是也会闪屏,不晓得哪位大侠能帮忙解决?
woairuijuan9 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 helpme2004 的回复:]
引用 3 楼 woairuijuan9 的回复:

如果楼主非要用重绘窗体,还可以设置一个委托,委托的任务是当有数据变更时进行更新数据,这样既能满足让数据最新,也不用无谓的频繁重绘了


不行吧?我就委托呢,老闪,没法解决!闪就闪吧!反正可以看清楚。
[/Quote]
呃,你如何更新数据的??如果频繁更新数据这个就和没有一样,这个是为了有的放矢,不会没有数据更新时也不停的进行重绘....
woairuijuan9 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 helpme2004 的回复:]
引用 3 楼 woairuijuan9 的回复:

如果楼主非要用重绘窗体,还可以设置一个委托,委托的任务是当有数据变更时进行更新数据,这样既能满足让数据最新,也不用无谓的频繁重绘了


不行吧?我就委托呢,老闪,没法解决!闪就闪吧!反正可以看清楚。
[/Quote]
呃,你如何更新数据的??如果频繁更新数据这个就和没有一样,这个是为了有的放矢,不会没有数据更新时也不停的进行重绘....
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 woairuijuan9 的回复:]

如果楼主非要用重绘窗体,还可以设置一个委托,委托的任务是当有数据变更时进行更新数据,这样既能满足让数据最新,也不用无谓的频繁重绘了
[/Quote]

不行吧?我就委托呢,老闪,没法解决!闪就闪吧!反正可以看清楚。
waterfisher2012 2012-01-13
  • 打赏
  • 举报
回复

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;

namespace WindowsFormsApplication4
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
timer1.Interval = 1000;

}

private void button1_Click(object sender, EventArgs e)
{


if (textBox1.Text == "" || int.Parse(textBox1.Text) <= 0)
{

MessageBox.Show("请正确输入倒计时秒数");
}
else
{
progressBar1.Maximum = int.Parse(textBox1.Text);
if (button1.Text == "开始")
{
timer1.Enabled = true;
button1 .Text ="停止";
}
else
{
timer1.Enabled = false;
button1.Text = "开始";
}
}
}

private void timer1_Tick(object sender, EventArgs e)
{

if (int.Parse (textBox1 .Text )>0)
{
textBox1.Text = (int.Parse(textBox1.Text) - 1).ToString ();
progressBar1.Value += 1;
int a = int.Parse(textBox1.Text);
int b = (int)a / 60;//分钟
int c = a % 60;//秒钟
int d = (int)b / 10;//分钟 十位数字
int h = b % 10;//分钟 个位数字
int f=(int)c/10;//秒钟 十位数字
int g = c % 10;//秒钟 个位数字
int i = (int)b / 60;//时钟
int j = (int)i / 10;//时钟 十位数字
int k = i % 10;//时钟 个位数字
textBox2.Text =j.ToString ()+k.ToString ()+":"+ d.ToString() + h.ToString() + ":" + f.ToString() + g.ToString();
}
else
{
timer1.Enabled = false;
MessageBox.Show("时间到!");
progressBar1.Value = 0;
button1.Text = "开始";
}
}
private void button2_Click_1(object sender, EventArgs e)
{

timer1.Enabled = false;
textBox1.Text = "0";
textBox2.Text = "00:00:00";
progressBar1.Value = 0;
button1.Text = "开始";

}

private void Form1_Load(object sender, EventArgs e)
{
textBox1.Select();

}


}
}



小菜鸟写的倒计时,好像不会闪屏哦

woairuijuan9 2012-01-13
  • 打赏
  • 举报
回复
如果楼主非要用重绘窗体,还可以设置一个委托,委托的任务是当有数据变更时进行更新数据,这样既能满足让数据最新,也不用无谓的频繁重绘了
woairuijuan9 2012-01-13
  • 打赏
  • 举报
回复
看楼主的意思是想刷新数据而不是刷新窗体吧...
其实刷新数据没必要让整个窗体都进行重绘..
重绘窗体时非常耗资源的。如果你想简单的来,可以将数据更新写入listview空间的重绘事件,timer控制触发重绘事件,当然这样也不完美,但绝对不会闪屏..

110,580

社区成员

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

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

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