找回密码
 立即注册

QQ登录

只需一步,快速开始

soulxj2020

初级会员

7

主题

88

帖子

437

积分

初级会员

积分
437

圣诞拼拼乐微信认证勋章

soulxj2020
初级会员   /  发表于:2020-5-14 10:52  /   查看:10223  /  回复:16
10金币
本帖最后由 soulxj2020 于 2020-5-20 09:58 编辑

环境:VS2015+Win7+.Net4.6.2(WinForm开发)+C1.Win.C1Schedule.4

背景:
  业务需求1:c1Schedule的显示(滚动)位置,能记住/定位到指定点。
  业务需求2:双c1Schedule时,两边显示(滚动)位置,能同步。

针对需求1,我的同事在这个贴子里selectedinterval的设置问题尝试通过设置selectedinterval来实现,结果控件不支持。
所以我们现在尝试设置滚动条位置来解决上述需求1,2。
过程中,发现本贴的问题。

现象&问题:如题所述。在c1Schedule_Scroll最开始设置断点,也跑不进去。。。

事件绑定如下:
this.c1SchedulePlan.Scroll += new System.Windows.Forms.ScrollEventHandler(this.c1Schedule_Scroll);
this.c1ScheduleReport.Scroll += new System.Windows.Forms.ScrollEventHandler(this.c1Schedule_Scroll);

事件实现:
  1. <font face="微软雅黑">private void c1Schedule_Scroll(object sender, ScrollEventArgs e)
  2. {
  3.         try
  4.         {
  5.                 if (!_Interlocking)
  6.                 {
  7.                         // スクロール連動の排他的制御
  8.                         _Interlocking = true;
  9.                         C1Schedule scdl = sender as C1Schedule;
  10.                         scdl.Update();
  11.                         Point pt = scdl.AutoScrollPosition;

  12.                         if (scdl.Equals(c1SchedulePlan))
  13.                         {
  14.                                 c1ScheduleReport.AutoScrollPosition = new Point(c1SchedulePlan.AutoScrollPosition.X, pt.Y);
  15.                         }
  16.                         else if (scdl.Equals(c1ScheduleReport))
  17.                         {
  18.                                 c1SchedulePlan.AutoScrollPosition = new Point(c1ScheduleReport.AutoScrollPosition.X, pt.Y);
  19.                         }

  20.                         this.Invalidate();
  21.                         this.Update();

  22.                         _Interlocking = false;
  23.                 }
  24.         }
  25.         catch (Exception ex)
  26.         {
  27.                 //ErrorProc(ex);
  28.         }
  29. }</font>
复制代码

麻烦版主帮忙确认一下:
1,c1Schedule_Scroll为什么不能触发,是哪里还有设置遗漏了吗?

2,需求2能通过双c1Schedule绑定c1Schedule_Scroll来实现吗?(即上述代码)请帮我们初步判断一下。

16 个回复

正序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-5-20 10:10:16
17#
不客气
回复 使用道具 举报
soulxj2020
初级会员   /  发表于:2020-5-20 09:56:49
16#
Richard.Ma 发表于 2020-5-19 18:49
这个算是产品本身还有一点问题,请注意我上面的代码,实际上等于说是每次把ViewType 重置了,这样设置就有 ...

谢谢。
刚才验证了一下,果然可以了。

虽然不能通过滚动条实时同步滚动,有点遗憾。
但目前这样算是基本实现了前面说的2个需求了。
非常感谢!
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-5-19 18:49:43
15#
这个算是产品本身还有一点问题,请注意我上面的代码,实际上等于说是每次把ViewType 重置了,这样设置就有效了


  1.             if (c1Schedule1.ViewType == C1.Win.C1Schedule.ScheduleViewEnum.WorkWeekView)
  2.             {
  3.                 c1Schedule1.ViewType = C1.Win.C1Schedule.ScheduleViewEnum.WeekView;
  4.                 c1Schedule1.ViewType = C1.Win.C1Schedule.ScheduleViewEnum.WorkWeekView;
  5.             }
复制代码
回复 使用道具 举报
soulxj2020
初级会员   /  发表于:2020-5-19 16:58:44
14#
本帖最后由 soulxj2020 于 2020-5-19 17:00 编辑

外层滚动条设置后,可以显示了,果然没有什么影响。
看来这条路确实行不通了。
要是内层的滚动条提供事件处理就好了。。。

通过FirstVisibleTime属性来同步时间,刚才我尝试了一下,有点奇怪的地方。
c1ScheduleReport中app拖动数次,只有第一次拖动会同步c1SchedulePlan的显示时间(滚动位置)。
第二次开始,c1SchedulePlan就不会滚动同步了。

代码设置如下:
    事件绑定:

  1.             this.c1ScheduleReport.AppointmentChanged += new System.EventHandler<C1.C1Schedule.AppointmentEventArgs>(this.c1ScheduleReport_AppointmentChanged);
复制代码

    事件实现:
  1.         private void c1ScheduleReport_AppointmentChanged(object sender, AppointmentEventArgs _e)
  2.         {
  3.                 c1ScheduleReport.Settings.FirstVisibleTime = new TimeSpan(_e.Appointment.Start.Hour, _e.Appointment.Start.Minute, _e.Appointment.Start.Second);
  4.                 c1SchedulePlan.Settings.FirstVisibleTime = new TimeSpan(_e.Appointment.Start.Hour, _e.Appointment.Start.Minute, _e.Appointment.Start.Second);
  5.                 c1ScheduleReport.Refresh();
  6.                 c1SchedulePlan.Refresh();
  7.         }
复制代码



回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-5-19 16:31:17
13#
设置代码如下:
  1.             c1Schedule1.HorizontalScroll.Visible = true;
  2.             c1Schedule1.VerticalScroll.Visible = true;
复制代码


但是设置后出现的外层滚动条,拖动并不会对内部的日历产生影响,你可以测试一下
你说到的双c1Schedule同步,如果是要同步时间的话那刚才的FirstVisibleTime属性就可以,如果还要同步日期的话
可以通过分析两个日历的日期,然后通过gotodate来实现

  1.             c1Schedule1.GoToDate(e.Appointment.Start.AddDays(7));
  2.             c1Schedule1.Refresh();
复制代码


回复 使用道具 举报
soulxj2020
初级会员   /  发表于:2020-5-19 15:06:23
12#
Richard.Ma 发表于 2020-5-19 11:03
验证了一下如果是要滚动来设置起始时间的话,可以使用下面的方式设置FirstVisibleTime,在AppointmentChang ...

谢谢回复。

经过测试,在AppointmentChanged事件中设置FirstVisibleTime来实现起始位置,基本上达到了需求,谢谢。

Scroll事件这个点,【c1Schedule1的滚动条设置为Visable后效果如下,也能触发滚动事件,但是本身因为并无滚动的场景,没什么用处】对于这部分内容还有些不理解。
1,哪里设置滚动条Visable属性?
2,无滚动场景怎么理解呢?  如果可以获取和设置滚动条的位置,说不定可以实现双c1Schedule位置同步。。。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-5-19 09:02:30
10#
不客气,我早上给你验证
回复 使用道具 举报
soulxj2020
初级会员   /  发表于:2020-5-18 18:56:20
9#
Richard.Ma 发表于 2020-5-18 17:48
收到,那目前看起来主要是c1Schedule的显示(滚动)位置需要可以自动调整,我会再验证这个问题

好的,谢谢!!!
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-5-18 17:48:59
8#
收到,那目前看起来主要是c1Schedule的显示(滚动)位置需要可以自动调整,我会再验证这个问题
回复 使用道具 举报
soulxj2020
初级会员   /  发表于:2020-5-18 17:12:46
7#
本帖最后由 soulxj2020 于 2020-5-18 17:21 编辑
Richard.Ma 发表于 2020-5-18 17:06
您好,这个问题已经登记为bug,ID:436281
问题可能需要一些时间确认原因

好的,谢谢详细需求已私信。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部