junlingzhu2002 发表于 2012-12-18 16:02:00

Scrool的移动伴随Cell内容的移动

画面按照日期的顺序来表示,如果日期相同,那么只在相同日期的Cell的第一行表示这个值,
但如果移动Scrool,那么这个日期就会随着Scrool的移动而移动。
也就是说,这个日期总是出现在画面表示的相同日期的第一行。
比如第一行到第十行的日期为20121217,如果第一行在画面的第一行时,
第一行日期显示20121217,第二行到第十行的日期是空白;
移动Scrool使现在的第5行表示在画面的第一行时,第5行日期显示20121217

junlingzhu2002 发表于 2012-12-18 16:04:00

这个怎么实现

wedy.wang 发表于 2012-12-24 12:30:00

回复 2楼junlingzhu2002的帖子

这个在目前的版本无法实现。
我们的MultiRow For WinForm 7.0有这个功能,设置两个属性就可以解决了。
如果你是日文用户,可以考虑使用我们的7.0版本。谢谢。

junlingzhu2002 发表于 2012-12-25 14:52:00

谢谢,你说的是Cell的合并功能吗?
不过我需要的不是将相同值的Cell合并,
而是在滚动条发生变化时,日期总是出现在画面所表示的相同日期的第一行

wedy.wang 发表于 2012-12-25 18:00:00

回复 4楼junlingzhu2002的帖子

我给你个SampleCode,有些地方可能不是很完善,请你再修改一下。
使用自定义DateTimePickerCell来实现。

    public class MyDateTimePickerCell : DateTimePickerCell
    {
      protected override void PaintCellForeground(CellPaintingEventArgs e)
      {
            if (this.GcMultiRow != null && e.FormattedValue != null)
            {
                  if (this.ShouldDisplayText(e.FormattedValue, e.RowIndex, e.CellIndex))
                  {
                        base.PaintCellForeground(e);
                  }
            }
            else
            {
                base.PaintCellForeground(e);
            }
      }
      bool ShouldDisplayText(object value, int currentRowIndex, int cellIndex)
      {
            for (int i = currentRowIndex - 1; i >= this.GcMultiRow.FirstDisplayedCellPosition.RowIndex; i--)
            {
                if (i == -1)
                {
                  break;
                }
                object valueAbove = this.GcMultiRow.GetValue(i, cellIndex);
                if (valueAbove == null)
                {
                  return true;
                }

                if (object.Equals(((DateTime)value).Date, ((DateTime)valueAbove).Date))
                {
                  return false;
                }
            }

            return true;
      }
    }
    public partial class Form1 : Form
    {
      public Form1()
      {
            InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
            this.gcMultiRow1.Template = Template.CreateGridTemplate(new Cell[] {
                new MyDateTimePickerCell() {Format = DateTimePickerFormat.Short},
                new TextBoxCell(),
                new TextBoxCell()});
            this.gcMultiRow1.RowCount = 5;
            this.gcMultiRow1.Scroll += gcMultiRow1_Scroll;
      }

      void gcMultiRow1_Scroll(object sender, ScrollEventArgs e)
      {
            this.gcMultiRow1.InvalidateCell(0, 0);
      }
    }
页: [1]
查看完整版本: Scrool的移动伴随Cell内容的移动