找回密码
 立即注册

QQ登录

只需一步,快速开始

sxyweiren

中级会员

73

主题

366

帖子

755

积分

中级会员

积分
755

活字格认证微信认证勋章

sxyweiren
中级会员   /  发表于:2015-12-21 16:20  /   查看:11296  /  回复:18
最近开始接触MultiRow,发现8.0跟4.0甚至以前版本区别稍微有些大。因此有通过自定义控件的方式来减小差异的想法。

但是,现在提供的Demo里面好像没有对InputMan类型的单元格进行重构的例子。

请问,能不能提供个例子参考下。

初步构想是这样的:

1,由于单元格处于编辑状态的时候,按下回车键以及左右键甚至F1-F12不会触发MultiRow的KeyPreview事件,因此想要通过自定义单元格呼出GcMultiRow的这些事件。

2,由于GcDate以及GcNumber类型的控件,原有的IvalidateRange以及IvalidateValue事件已经没有了。并且值的还原动作也不一样了。所以想要在封装的单元格里面增加这些动作。

3,Template的动态重构:由于Mr4.0的复数行表示与Mr8.0的复数行表示差异过于大,所以预定对Template进行动态重构,在Template的值发生变更的时候,动态的读入设定的Template并对该Template进行初期化
    说明:Mr4.0里面,如果每条数据复数行显示的时候(第一行5列第二行7列),可以通过Mr(1,5,1)来定位到第二行的第二小行的第六列
             Mr8.0里面,由于不支持 上面的三个数字来定位单元格的形式,所以代码要通过数单元格的形式来实现。但是对于不规则模板,就比较麻烦了。比如:Mr(1,10)来定位同样的单元格。

4,如果上面的构思3实现不了的话,预计通过循环单元格的形式来吧上面的单元格在BaseControl里面给数出来。这样需要把MultiRow进行下简单的封装

5,由于GcDate以及GcNumber类型的控件,如果通过Source赋予一个超过最大值的一个值的时候,Mr8.0里面会抛出一个异常,而Mr4.0里面会进行上面2所说的处理。这个也希望在自定义控件里面解决。
  

由于上面的仅仅是现在的构思,且这个项目马上就要结束了(MR4.0?Mr8移行),最近比较忙,还没进行实施。
但是已经确定下个项目还是这样的移行。所以希望提前有理论基础。

请问:
上面的动作有没有可能实现?

有没有封装InputMan的单元格的Demo,能不能提供下?

18 个回复

正序浏览
robert
金牌服务用户   /  发表于:2015-12-28 15:49:00
19#
能解决问题就好
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2015-12-28 14:35:00
18#
回复 17楼robert的帖子

恩,谢谢了。。

幸亏有你的代码,要不然EditingControl的自定义有可能就实现不了了。
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2015-12-25 15:50:00
17#
回复 13楼sxyweiren的帖子

你写的代码是正解
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2015-12-25 15:50:00
16#
恩,确实很多定制逻辑要自己写
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2015-12-25 14:50:00
15#
回复 0楼sxyweiren的帖子

但是自定义的ShortCutKey稍微有点局限性。

类似于左右方向键,如果处于编辑状态的场合,按下左右键光标的移动需要自己写。。稍微有点麻烦。
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2015-12-25 14:47:00
14#
回复 11楼robert的帖子

谢谢,,有这些代码我就可以把自定义的EditingControl和自定义的单元格类型关联起来了。。
回复 使用道具 举报
sxyweiren
中级会员   /  发表于:2015-12-25 14:45:00
13#
回复 12楼robert的帖子

就是通过下面的代码,直接把Mr的快捷键注册了.这样回车键和Tab键相关的按键在编辑状态下就可以触发了.
不过回车键之类的动作要用代码完成.

void Form1_Load(object sender, EventArgs e)
{
    gcMultiRow1.Template = Template.Default;
    gcMultiRow1.RowCount = 5;

    // Register another action to a existent key. Unregister old key first.
    this.gcMultiRow1.ShortcutKeyManager.Unregister(Keys.Enter);
    // Register to new action.
    this.gcMultiRow1.ShortcutKeyManager.Register(new EditThenMoveNextAction(), Keys.Enter);

    // Register an action list. Select all first, and then, copy.
    this.gcMultiRow1.ShortcutKeyManager.Register(new ActionList(SelectionActions.SelectAll, EditingActions.Copy), Keys.Control | Keys.Shift | Keys.C);
}

class EditThenMoveNextAction : Action
{
    public override bool CanExecute(GcMultiRow target)
    {
        return true;
    }

    protected override void OnExecute(GcMultiRow target)
    {
        if (target.IsCurrentCellInEditMode == false && EditingActions.BeginEdit.CanExecute(target))
        {
            EditingActions.BeginEdit.Execute(target);
        }
        else
        {
            SelectionActions.MoveToNextCell.Execute(target);
        }
    }
}
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2015-12-24 15:28:00
12#
》 现在倒是可以在ShortcutKeyManager里面通过自定义Action来实现调用。但是自定义单元格如何实现调用现在还没有方向。
这个问题没有看懂,能否把具体的用例说一下?
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2015-12-24 15:21:00
11#
》 EditingControl的KeyDown事件里面如何调用MultiRow的Keydown事件。

  1.     public class MyGcTextBoxCellType : GcTextBoxCell
  2.     {
  3.         public override Type EditType
  4.         {
  5.             get
  6.             {
  7.                 return typeof(MyGcTextBoxEditingControl);
  8.             }
  9.         }
  10.     }

  11.     public class MyGcTextBoxEditingControl : GcTextBoxEditingControl
  12.     {
  13.         protected override void OnKeyDown(KeyEventArgs e)
  14.         {
  15.             base.OnKeyDown(e);
  16.             (this.GcMultiRow as MyGcMultiRow).EditorKeyDown(e);
  17.         }
  18.     }

  19.     public class MyGcMultiRow : GcMultiRow
  20.     {
  21.         public void EditorKeyDown(KeyEventArgs e)
  22.         {
  23.             this.OnKeyDown(e);
  24.         }
  25.     }
复制代码
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部