找回密码
 立即注册

QQ登录

只需一步,快速开始

merciful

论坛元老

18

主题

46

帖子

4982

积分

论坛元老

积分
4982

活字格认证

merciful
论坛元老   /  发表于:2011-7-15 15:36  /   查看:8229  /  回复:5
现在我的程序出现下面的错误
模板有47列,第一列显示一个Icon,其他全部是label。

确认内容:multirow6本身是否对行数有限制?或者是显示的内容多少和什么有关系。
下面的问题是否有解决方法。

补充:我从网上搜索了一下,此错误有可能和图片有关,不知道是否是multirow本身的bug.
Icon的设定方法:this.gcResultGrid.SetValue(rowIndex, "Icon", imageList1.Images[2]);

System.ComponentModel.Win32Exception: Not enough storage is available to process this command
at System.Drawing.BufferedGraphicsContext.CreateCompatibleDIB(IntPtr hdc, IntPtr hpal, Int32 ulWidth, Int32 ulHeight, IntPtr& ppvBits)
   at System.Drawing.BufferedGraphicsContext.CreateBuffer(IntPtr src, Int32 offsetX, Int32 offsetY, Int32 width, Int32 height)
   at System.Drawing.BufferedGraphicsContext.AllocBuffer(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
   at System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)
   at System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at GrapeCity.Framework.Forms.FrameworkControl.WndProc(Message& m)
   at GrapeCity.Framework.Views.Windows.ElementContainerControl.WndProc(Message& m)
   at GrapeCity.Win.MultiRow.GcMultiRow.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

5 个回复

倒序浏览
barrylei
超级版主   /  发表于:2011-7-15 16:43:00
沙发
Icon的设定方法没有问题,我有几个问题,
1. 你的Icon的Size是多大?
2. 在RowCount是多少行的时候出现了这个问题?
你能否做一个简单的Sample,然后上传作为附件,我们check一下。
我刚才试了一下,我使用了Windows的自带Sample图片,RowCount为100000行,没有重现你说的问题。所以你有个Sample给我们最好。
回复 使用道具 举报
merciful
论坛元老   /  发表于:2011-7-15 17:12:00
板凳

回复 2# barrylei 的帖子

Icon的size=1KB
RowCount 估计最少也在20万行以上。
由于是客户那边出的问题,我只是猜想可能是multirow有极限限制。

我是从数据库中提取的数据,存储在datatable中,然后循环显示的。
我测试了14万条数据也没有问题,我的机器是2G的内存。

另外,我想知道,GrapeCity内部是否有过极限测试,这个极限跟什么有关。
回复 使用道具 举报
Arthas
葡萄城公司职员   /  发表于:2011-7-15 17:37:00
地板

回复 3# merciful 的帖子

根据我自己的个人经验, 最大行数与以下两个问题有关:
1 绑定的数据源的大小。
数据源本身是有大小的。 这个消耗不在MultiRow上。但是只要在内存有消耗, 就会导致内存不足。
毕竟大家都是一台机器上的对象, 就是绑在一条绳上的蚂蚱吗。
2 用户代码的写法。
例如, MultiRow的Cell有实例化的概念的,如果把MultiRow的Row都访问一遍, 就会把所有的Row都实例化一遍, 这样会导致大量的资源消耗。
但是如果不访问Row或者Cell, 而是用MultiRow的方法来进行操作, 就不会消耗太多资源。
其他可能导致Cell实例化的代码都可能引发性能问题。

此外的一些因素一般影响就不是很大了。 我自己建立过100万行的MultiRow, 绑定的数据列数虽然没有47列那么多, 但是也有两位数了。
还算比较流畅。不过我没绑定图形。 不知道是不是这个会影响很大。
此外我想知道, 你在绑定20万行数据的时候有没有在任务管理器里看下内存占用量有多少?
然后我们比较一下差异有多大。
如果差异大的惊人, 那么我怀疑会不会是不小心写了遍历Row的代码导致了大量Cell被实例化。
扯淡第一高手
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2011-7-15 17:47:00
5#
imageList1.Images[2] 这个方法每次调用都会重新创建一个新的Image对象。

请尝试以下代码;
  1. List<object> list = new List<object>();

  2. for (int i = 0; i < 200000; i++)
  3. {
  4.      list.Add(this.imageList1.Images[0]);
  5. }
复制代码
注意list要定义在Form上,避免被GC回收。

执行以上代码在我的电脑上消耗了1G内存。所以应该是大量的图片吧内存耗尽了,导致了异常。

解决方案。使用List自己管理图片,不要在行数巨大的时候使用ImageList
回复 使用道具 举报
merciful
论坛元老   /  发表于:2011-7-15 18:51:00
6#
Arthas :
14万条的时候,内存在500M左右。

robert :
我试着改写下代码,测试下。

感谢以上各位的回答。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部