xiechenming 发表于 2015-9-8 09:44:00

GetPreferredHeight获取单元格高度

准备获取一个文本单元格中获取最优高度,此单元格已设置为text类型,.multiline,wordwrap均是true.并且使用了columnspan。GetPreferredHeight方法好像不支持跨列呢。
请教如何在winform中实现文本单元格求最优高度。谢谢!

rbgongming 发表于 2015-9-8 10:12:00

回复 1楼xiechenming的帖子

你好:
思想就是将每列的WordWrap设置我True,然后用Spread的EditModeOff事件去获取最优行高
测试代码如下,请参考:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ' テキスト型セルを設定します
  Dim tcell As New FarPoint.Win.Spread.CellType.TextCellType()
  tcell.WordWrap = True
  FpSpread1.ActiveSheet.Columns(1).CellType = tcell
End Sub

Private Sub FpSpread1_EditModeOff(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FpSpread1.EditModeOff
  ' 最も高さのあるテキストの高さに設定します
  FpSpread1.ActiveSheet.Rows(0).Height = FpSpread1.ActiveSheet.GetPreferredRowHeight(0)
End Sub

xiechenming 发表于 2015-9-8 11:21:00

尝试过了,还是不行。
单元格内的文本是初始化生成的,不需要编辑,委托用不上啊



rbgongming 发表于 2015-9-8 11:32:00

回复 3楼xiechenming的帖子

你在赋值之后加上如下代码
FpSpread1.ActiveSheet.Rows(0).Height = FpSpread1.ActiveSheet.GetPreferredRowHeight(0)
如果你的Spread只是只读的,不会对其收入力的话,那个EditModeOff时间就不需要写了

xiechenming 发表于 2015-9-8 11:44:00

补充了代码,效果就是图2的效果,第一行高度被拉开了,但是明显不对

rbgongming 发表于 2015-9-8 13:00:00

回复 5楼xiechenming的帖子

你好,我测试过的,是可以的,感觉你在代码哪里有重新设置了行高,
或者是哪个属性引起的,可否上传一下你的再现Demo。

xiechenming 发表于 2015-9-8 14:19:00

截图里就是demo啊,难道不是columspan的原因?我感觉获取最优的行高是按一列宽度的单元格文本进行计算高度的。

frank.zhang 发表于 2015-9-8 14:45:00

您好,
我使用以下代码,没有能够重现问题,您看下是否遗漏了关键的步骤
            fpSpread1.ActiveSheet.Cells.Text = "测试";
            fpSpread1.ActiveSheet.Cells.ColumnSpan = 4;
            fpSpread1.ActiveSheet.Cells.Text = "很长很长\n很长很长很长\n很长很长很长很长很长很\n长很长很长很长长很长很长很长长很长很长很长";
            MaxNum = 12;

            FarPoint.Win.Spread.CellType.EnhancedColumnHeaderRenderer ecr = new FarPoint.Win.Spread.CellType.EnhancedColumnHeaderRenderer();
            ecr.WordWrap = true;
            fpSpread1.ActiveSheet.ColumnHeader.DefaultStyle.Renderer = ecr;
      }

      private void button1_Click(object sender, EventArgs e)
      {
            /**
            float len_txt = 0;
            for (int i = 0; i < MaxNum; i++)
            {
                len_txt = fpSpread1.ActiveSheet.GetPreferredColumnWidth(i);
                fpSpread1.ActiveSheet.Columns.Width = len_txt;
            }
             * */
            float len_txt = 0;
            for (int i = 0; i < MaxNum; i++)
            {
                len_txt = fpSpread1.ActiveSheet.GetPreferredRowHeight(i);
                fpSpread1.ActiveSheet.Rows.Height = len_txt;
            }
      }








另外,我测试的版本是最新8.1,不知道您的版本是多少?

xiechenming 发表于 2015-9-8 15:30:00

的确可以了。
采用示例中的EnhancedColumnHeaderRenderer类就可以。为什么使用时是设置列头的样式重绘呢,可以对单元格进行类似重绘达到同样目的吗?
谢谢!

xiechenming 发表于 2015-9-8 15:45:00

用EnhancedColumnHeaderRenderer设置样式后,单元格内容必须加换行符,否则显示不全内容,怎么办呢?
页: [1] 2
查看完整版本: GetPreferredHeight获取单元格高度