none
自动计算列宽,判断文本宽度的效率问题 RRS feed

  • 问题

  • 日前遇到一个问题:系统里使用了一个开源的网格控件,应用时发现自动设置列宽的函数效率极低。由于在项目只有文本数据,所以就针对网格中只填充文本数据的情况专门写了一个计算列宽的函数。但是发现效率依然不理想,在10列、3000行的数据规模下,整个设置列宽的过程需要80秒左右。

    鉴于计算列宽的逻辑比较简单,所以我认为问题应该出在判断文本宽度的函数上。在整个过程中,计算每个单元格中文本宽度的函数的执行次数显然是最多的。

    我使用的判断文本宽度的方法是Graphics.MeasureString,想请教一下这个函数的效率是不是比较低?如果是,那是否有效率更好的方法?
    2009年6月8日 2:54

答案

  • 你只计算字数最多的单元格就可以了,少的自然不用计算,所以,你需要在填充之前决定好字数最多文本
    10列的话,也就是10个需要计算
    【孟子E章】
    • 已标记为答案 泉子 2009年6月15日 1:13
    2009年6月8日 2:59
    版主
  • 你好,10 列的情况下,只需要对这10个例分别设一次列宽也就是10次,你是不是设了 10* 3000 次导致你的问题产生。
    知识改变命运,奋斗成就人生!
    • 已标记为答案 泉子 2009年6月15日 1:13
    2009年6月8日 3:03
    版主
  • 你好,

    不要一次做这么多的计算,那你可以使用分页的方法,每显示一屏时,计算并设置一下列宽好了。或者你干脆设计你程序的逻辑,提前使用工作线程在后台做好计算,然后当需要时设置列宽好了。

    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月15日 1:13
    2009年6月10日 2:38
    版主
  • 如果你的屏幕无法同时显示3000行,那么不如别处理那么多数据。


    Eternal Snow
    • 已标记为答案 泉子 2009年6月15日 1:14
    2009年6月14日 6:47
  • 你就大概呀,又不需要100%准确。
    好好学习,天天向上。
    • 已标记为答案 泉子 2009年6月15日 1:14
    2009年6月14日 7:26

全部回复

  • 你只计算字数最多的单元格就可以了,少的自然不用计算,所以,你需要在填充之前决定好字数最多文本
    10列的话,也就是10个需要计算
    【孟子E章】
    • 已标记为答案 泉子 2009年6月15日 1:13
    2009年6月8日 2:59
    版主
  • 你好,10 列的情况下,只需要对这10个例分别设一次列宽也就是10次,你是不是设了 10* 3000 次导致你的问题产生。
    知识改变命运,奋斗成就人生!
    • 已标记为答案 泉子 2009年6月15日 1:13
    2009年6月8日 3:03
    版主
  • 字符串长度并不与文本宽度一定一致。全角和半角字符的宽度是不同的。
    2009年6月8日 3:03
  • 不是~~
    2009年6月8日 3:04
  • 你好,

    不要一次做这么多的计算,那你可以使用分页的方法,每显示一屏时,计算并设置一下列宽好了。或者你干脆设计你程序的逻辑,提前使用工作线程在后台做好计算,然后当需要时设置列宽好了。

    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月15日 1:13
    2009年6月10日 2:38
    版主
  • 如果你的屏幕无法同时显示3000行,那么不如别处理那么多数据。


    Eternal Snow
    • 已标记为答案 泉子 2009年6月15日 1:14
    2009年6月14日 6:47
  • 你就大概呀,又不需要100%准确。
    好好学习,天天向上。
    • 已标记为答案 泉子 2009年6月15日 1:14
    2009年6月14日 7:26
  • 谢谢各位,从应用上来说,肯定是有解决办法的。我只是想了解一下Graphics.MeasureString~
    2009年6月15日 1:13