我做了一个用户控件,在一个winform上根据表的行数动态增加用户控件,一行就一个用户控件,但当这个表有几百行数据时,刷新数据还没什么问题,但是窗体一失去焦点再获得焦点时,窗体的用户控件才一个个的出现,几百个用户控件一个一个的出现这个问题太严重了!各位高手有什么绝招教教!
解决方案 »
- 提示:com.ExecuteNonQuery();语句有误(关键字 'into' 附近有语法错误。)
- C# winform 的webbrowser控件如何屏蔽重复提交表单时弹出的对话框?
- c# panel添加一个新的form后,拉大form,panel滚动条不会自动出现
- 这样截取字符串为什么不行?
- 如何让WebBrowser获取单击事件?
- 如何获取axWebBrowser显示网页的控件并编辑,如何获取axWebBrowser里所有的form集合
- 很郁闷的问题 ,请教了。
- C#-Debug时遇到的奇怪问题
- 把一个记录很多的表绑定到DATAGRID里,怎样处理progressBar???
- 我想做一个,在form上能生成圆,这个圆能拉大拉小,能删除,点这个圆能弹出一个form的控件,谁做过,给个小例子看一看..
- C#关于ToolTip的问题,如何做自己的tooltip呢??在线等待!!!!!!!!!!!!!
- Windows Mobile 5下DataGrid 的滚动条被拖到或点击时会触发什么事件?
{
this.SuspendLayout();
}
private void Form1_Activated(object sender, EventArgs e)
{
this.ResumeLayout();
}
根据windows的消息循环协议。没一个wind都有自己的运行空间,超过一定数量以后,机器就会吃不消的。很久没看了,大概就是这个意思。
public Form1()
{
InitializeComponent(); this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint
, true);
}
参考Window的List控件的Virtual List-View设计方法数据由自己单独管理,画面当前显示哪些行列的数据在需要显示的时候向这个数据池获取
比如:
画面当前只能显示30行5列,当前第一行第一列是这个数据池中的第20个人的第3种状态
那么在数据池中就存在一个偏移起始点(20,3)也就是说画面的第一行第一列这个时候显示的是数据池中的第20行第3列数据
如果画面进行了卷动,比如向上滚动一行,那么这个时候第一行第一列显示的数据就是第19行第3列以此类推,因为画面上只有30行5列的空间,你永远只需要记住第一行第一列在数据池中对应的位置,其他的数据根据偏移累加计算即可
你使用了Panel,Label,TextBox控件
基本上Panel就是绘制边框,Label就是做TextOut输出,而TextBox则有两态,一种状态是非输入状态,也就是没有焦点,那么可以和Label一样处理做TextOut输出来替代,另外一种状态是输入态,需要用真正的TextBox
如果这样设计,那么你只需要一个TextBox控件,其他的都用GDI/GDI+的绘制来替代,速度会很快,再记得用双缓冲技术避免闪烁即可
如果用GDI/GDI+能不能实现这些功能啊,难度大不大啊?
有必要一次放几百个usercontrol在form上?
//双缓冲防止闪烁
SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
但是没看出来和原来有什么不同!
是不是要放在其他地方的啊!
因为你的控件既然是动态生成的,那么所有的控件的位置数据都是已经有的了
剩下的问题只是在绘制的响应函数中添加一个对所有的数据进行绘制的函数这个函数中根据位置进行绘制,而不是生成控件另外需要处理的就是获得焦点的数据需要生成一个动态的TextBox,这个把原来动态生成控件的代码稍微改动一下就可以了这种代码初步的重构完成大概只需要一天不到的时间
不过如果你没有用过GDI或者GDI+,那么需要计算你学习GDI相关内容的时间测试去除BUG稳定功能再+一天的时间,差不多也就2~3天的时间就可以全部搞定。