none
关于控件数组arraylist的有关问题 RRS feed

  • 问题

  • 根据需求,需要在picturebox上动态添加多个层,层可移动、删除,层内可根据有关数据绘制图形。

    问题1:这个层是用usercontrol还是写个继承自panel的自定义控件做或是其他的比较好,感觉panel要快点
    问题2:绘制图形时需要查询获取有关数据,数据的获取是在绘制时从datatable中查询得到还是在事先查询好形成datatable作为属性放到控件中速度快,内存占用少
    2009年5月27日 0:31

答案

  • 你好,

    这个问题的答案是具体问题具体分析,给出你的真实场景:

    1 数据量大小(关于内存的使用)
    2 你如何查找数据(关于查找效率)


    考虑到控件会不停绘制,所以我认为把数据取出来,而不是每次绘制时都去取数据,效率会好一些,但是如果多个控件使用同样的数据,这样会浪费内存,根据你的情况作决定。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 ahking 2009年5月30日 23:39
    • 取消答案标记 ahking 2009年5月31日 3:08
    • 已标记为答案 ahking 2009年6月5日 1:35
    2009年5月29日 5:57
    版主

全部回复

  • 1.根据实际需要 2。先取出来会快一些
    http://feiyun0112.cnblogs.com/
    • 已标记为答案 ahking 2009年5月30日 23:38
    • 取消答案标记 ahking 2009年5月31日 3:09
    2009年5月27日 0:57
    版主
  • 你好!
         1,可以使用Panel,相对简单一些
     
         2,  先把数据放到DataTable里会快一些的!
    周雪峰
    • 已标记为答案 ahking 2009年5月30日 23:38
    • 取消答案标记 ahking 2009年5月31日 3:09
    2009年5月27日 2:14
    版主
  • 你好!
         1,可以使用Panel,相对简单一些
     
         2,  先把数据放到DataTable里会快一些的!
    周雪峰

    我想将一些事件封装到panel中,应该用自定义控件,继承panel就行吧
    2009年5月27日 2:37
  • 另外,每个控件都带个datatable不会占用太多内存吧
    2009年5月27日 3:02
  • 不要放在datatable里面   一定需要的话请放在hashtable里面
    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年5月27日 3:11
    版主
  • 不要放在datatable里面   一定需要的话请放在hashtable里面
    紫柔版主的头像真叫萌得一个不行啊。。。。

    为什么呢,分析下原理吧
    2009年5月27日 6:05
  • 你好!
         1,你继承Panel,实现自己的控件,然后添件事件就可以了!
         2,只放入需要的数据,可以节省很多的内存!
         3,我想韦版主的意思是放到HashTable里查找效率比较高吧!
        
    周雪峰
    • 已标记为答案 ahking 2009年5月30日 23:38
    • 取消答案标记 ahking 2009年5月31日 3:09
    2009年5月27日 6:51
    版主
  • 你好!
         1,你继承Panel,实现自己的控件,然后添件事件就可以了!
         2,只放入需要的数据,可以节省很多的内存!
         3,我想韦版主的意思是放到HashTable里查找效率比较高吧!
        
    周雪峰
    继承Panel开发起来感觉不如usercontrol方便,因为usercontrol可以通过属性直接添加事件等,就是怕效率不如panel
    2009年5月27日 7:58
  • 1. 如果看重程序的效率可以选择继承 Panel 来实现,因为加载一个 UserControl 的开销要比加载一个 Panel 大,如果不看中的话可以选用 UserControl 因为即见既所得使开发起来要方便得多
    2. 如果数据经常被用到可以在程序启动时就把数据预先读取出来(WinFrom 程序一般都这样使用),如果数据比较简单可以考虑用一些轻量级的变量来代替 DataTable,如 List, Dictionary, Hashtable 等

    知识改变命运,奋斗成就人生!
    • 已标记为答案 ahking 2009年5月30日 23:38
    • 取消答案标记 ahking 2009年5月31日 3:09
    2009年5月27日 12:13
    版主
  • 请问你说的“usercontrol可以通过属性直接添加事件”是什么意思啊?没有明白啊!
    周雪峰
    2009年5月27日 12:14
    版主
  • 不要放在datatable里面   一定需要的话请放在hashtable里面
    紫柔版主的头像真叫萌得一个不行啊。。。。

    为什么呢,分析下原理吧

    一般的datable 并没有提供什么按照键加速的功能    你用 key /row  放在hashtable 和 dictionary中可以获得最佳的查找性能

    如果您需要的只是顺序输出   那么建议用 sorted dictionary.   或者干脆用datatable 排序后转移为数组。  datatable 太重量级
    紫柔版主的头像真叫萌得一个不行啊。。。。
    • 已标记为答案 ahking 2009年5月30日 23:39
    • 取消答案标记 ahking 2009年5月31日 3:09
    2009年5月28日 2:42
    版主
  • 1. 如果看重程序的效率可以选择继承 Panel 来实现,因为加载一个 UserControl 的开销要比加载一个 Panel 大,如果不看中的话可以选用 UserControl 因为即见既所得使开发起来要方便得多
    2. 如果数据经常被用到可以在程序启动时就把数据预先读取出来(WinFrom 程序一般都这样使用),如果数据比较简单可以考虑用一些轻量级的变量来代替 DataTable,如 List, Dictionary, Hashtable 等

    知识改变命运,奋斗成就人生!

    1.真要是追求效率,控件当然是自己开发了。继承了话方便,但是会产生很多多余的信息,占用更多资源。但是你要花点时间写代码。
    2.不建议使用datatable.自定义数组,或者其它数据类型,如果可以尽量使用结构体。hastable符合要求可以使用。但是要考虑你实际的数据信息结构。~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    • 已标记为答案 ahking 2009年5月30日 23:39
    • 取消答案标记 ahking 2009年5月31日 3:09
    2009年5月28日 2:59
    版主
  • 请问你说的“usercontrol可以通过属性直接添加事件”是什么意思啊?没有明白啊!
    周雪峰

    说错了,是通过属性设计窗口
    2009年5月28日 13:04
  • 1. 如果看重程序的效率可以选择继承 Panel 来实现,因为加载一个 UserControl 的开销要比加载一个 Panel 大,如果不看中的话可以选用 UserControl 因为即见既所得使开发起来要方便得多
    2. 如果数据经常被用到可以在程序启动时就把数据预先读取出来(WinFrom 程序一般都这样使用),如果数据比较简单可以考虑用一些轻量级的变量来代替 DataTable,如 List, Dictionary, Hashtable 等

    知识改变命运,奋斗成就人生!

    1.真要是追求效率,控件当然是自己开发了。继承了话方便,但是会产生很多多余的信息,占用更多资源。但是你要花点时间写代码。
    2.不建议使用datatable.自定义数组,或者其它数据类型,如果可以尽量使用结构体。hastable符合要求可以使用。但是要考虑你实际的数据信息结构。~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl

    先把所有数据放到datatable中,具体到每个控件,用结构体来存储有关数据怎么样?
    即在生成控件的时候就查询相关数据放到struct中并传给控件
    2009年5月28日 13:12
  • 你好,

    这个问题的答案是具体问题具体分析,给出你的真实场景:

    1 数据量大小(关于内存的使用)
    2 你如何查找数据(关于查找效率)


    考虑到控件会不停绘制,所以我认为把数据取出来,而不是每次绘制时都去取数据,效率会好一些,但是如果多个控件使用同样的数据,这样会浪费内存,根据你的情况作决定。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 ahking 2009年5月30日 23:39
    • 取消答案标记 ahking 2009年5月31日 3:08
    • 已标记为答案 ahking 2009年6月5日 1:35
    2009年5月29日 5:57
    版主
  • 你好,

    这个问题的答案是具体问题具体分析,给出你的真实场景:

    1 数据量大小(关于内存的使用)
    2 你如何查找数据(关于查找效率)


    考虑到控件会不停绘制,所以我认为把数据取出来,而不是每次绘制时都去取数据,效率会好一些,但是如果多个控件使用同样的数据,这样会浪费内存,根据你的情况作决定。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    数据量不算大,几十条记录,十几个字段,类型主要为decimal和int
    控件也是几十个,查找是按照一个文本型字段相同的方式来查找
    2009年5月29日 7:05
  • 这么小的数据量可以先取出放到DataTable里处理,不会占用太多内存的!
    周雪峰
    • 已标记为答案 ahking 2009年5月30日 23:39
    • 取消答案标记 ahking 2009年5月31日 3:08
    2009年5月29日 10:54
    版主
  • 我使用panel做为绘图层,可是感觉性能还是不够好,是不是因为.net的原因

    是这样,我在快速拖动层的时候,picturebox上的图片上的线条等被抹花,停止拖动就好了;而我在.net 1.1的情况下就没有这个问题

    panel的背景设置为透明

    2009年5月31日 3:13
  • 但是感觉都有拖尾现象出现
    2009年5月31日 3:18
  • 你尝试开启双缓冲试试!
    周雪峰
    2009年5月31日 4:05
    版主
  • 你尝试开启双缓冲试试!
    周雪峰

          this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
                this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);

    form1的构造函数中无效,放到panel的构造函数中运行时出错
    2009年5月31日 6:39
  • 你好!
         把这行放到Panel的构造函数里试试!
    周雪峰
    2009年5月31日 11:50
    版主
  • 你好!
         把这行放到Panel的构造函数里试试!
    周雪峰

    试了啊,运行时出错,参数无效。。
    2009年6月1日 1:32
  • 尝试下定制的Panel控件:

    Public Class MyPanel
        Inherits Panel
        Public Sub New()
            Me.DoubleBuffered = True
        End Sub
    End Class

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年6月1日 6:03
    版主
  • 尝试下定制的Panel控件:

    Public Class MyPanel
        Inherits Panel
        Public Sub New()
            Me.DoubleBuffered = True
        End Sub
    End Class

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.

    我用的是c#,然后doublebuffer应该是.net 1.1的,我用的是.net 2.0的
    2009年6月1日 6:06
  • 你不能改写成C#吗?

    1. public class MyPanel : Panel
    2. {
    3.     public MyPanel()
    4.     {
    5.         this .DoubleBuffered = true;
    6.     }
    7. }

    Control. DoubleBuffered Property 是在.NET 2.0中开始被支持的呀,查下MSDN你就知道了:

    .NET Framework

    Supported in: 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年6月1日 6:11
    版主
  • 你不能改写成C#吗?

    1. public class MyPanel : Panel
    2. {
    3.     public MyPanel()
    4.     {
    5.         this .DoubleBuffered = true;
    6.     }
    7. }

    Control. DoubleBuffered Property 是在.NET 2.0中开始被支持的呀,查下MSDN你就知道了:

    .NET Framework

    Supported in: 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.

    1. public class MyPanel : Panel
    2. {
    3.     public MyPanel()
    4.     {
    5.          DoubleBuffered = true;
    6.     }
    7. }

    加this.没有该属性,版主写的this空格 点不知有何含义,不过我都试过了,还是报错,参数错误;我只是自己写了onpaint事件,根据参数画个实心圆,奇怪啊,不加双缓冲就一点没事

    2009年6月1日 7:50
  • 你不能改写成C#吗?

    1. public class MyPanel : Panel
    2. {
    3.     public MyPanel()
    4.     {
    5.         this .DoubleBuffered = true;
    6.     }
    7. }

    Control. DoubleBuffered Property 是在.NET 2.0中开始被支持的呀,查下MSDN你就知道了:

    .NET Framework

    Supported in: 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.

    1. public class MyPanel : Panel
    2. {
    3.     public MyPanel()
    4.     {
    5.          DoubleBuffered = true;
    6.     }
    7. }

    加this.没有该属性,版主写的this空格 点不知有何含义,不过我都试过了,还是报错,参数错误;我只是自己写了onpaint事件,根据参数画个实心圆,奇怪啊,不加双缓冲就一点没事


    那个只是排版的时候的显示问题哈
    public class MyPanel : Panel
       {
          public MyPanel()
          {
             this.DoubleBuffered = true;
          }
       }

    是有这个属性的 检查下看看是否继承自Panel,已经是导入了命名空间
    using System.Windows.Forms;

    注意:此属性在 .NET Framework 2.0 版中是新增的。

    获取或设置一个值,该值指示此控件是否应使用辅助缓冲区重绘其图面,以减少或避免闪烁。

    命名空间:System.Windows.Forms
    程序集:System.Windows.Forms(在 system.windows.forms.dll 中)


    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    2009年6月1日 8:20
    版主
  • 你不能改写成C#吗?

    1. public class MyPanel : Panel
    2. {
    3.     public MyPanel()
    4.     {
    5.         this .DoubleBuffered = true;
    6.     }
    7. }

    Control. DoubleBuffered Property 是在.NET 2.0中开始被支持的呀,查下MSDN你就知道了:

    .NET Framework

    Supported in: 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.

    1. public class MyPanel : Panel
    2. {
    3.     public MyPanel()
    4.     {
    5.          DoubleBuffered = true;
    6.     }
    7. }

    加this.没有该属性,版主写的this空格 点不知有何含义,不过我都试过了,还是报错,参数错误;我只是自己写了onpaint事件,根据参数画个实心圆,奇怪啊,不加双缓冲就一点没事


    那个只是排版的时候的显示问题哈
    public class MyPanel : Panel
       {
          public MyPanel()
          {
             this.DoubleBuffered = true;
          }
       }

    是有这个属性的 检查下看看是否继承自Panel,已经是导入了命名空间
    using System.Windows.Forms;

    注意:此属性在 .NET Framework 2.0 版中是新增的。

    获取或设置一个值,该值指示此控件是否应使用辅助缓冲区重绘其图面,以减少或避免闪烁。

    命名空间:System.Windows.Forms
    程序集:System.Windows.Forms(在 system.windows.forms.dll 中)


    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond


    终于找到提示参数错误的原因了:

    在mypanel的paint事件中
    绘图操作放到
    using(Graphics g = e.Graphics)
    {}
    中了
    改成Graphics g = e.Graphics;
    然后对g进行绘图操作就没问题了,猜想可能是因为双缓冲g放在内存中不能被释放的原因吧,但这又带来另外一个问题,g怎么被回收啊,不会占用过多内存吧,因为有多个mypanel

    2009年6月1日 8:32
  • 你不能直接使用e.Graphics绘制吗?

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年6月4日 9:21
    版主