找回密码
 立即注册

QQ登录

只需一步,快速开始

dlerror
中级会员   /  发表于:2016-6-23 09:28  /   查看:3817  /  回复:4
本帖最后由 dlerror 于 2016-6-23 10:37 编辑

开发环境:Win7-64bit + VS2015(VB.net) + SPREAD for Windows Forms 8.0
想要实现如下的功能,请版主帮忙解决一下。
有一个10列的表格,第1列的Locked=True,第2~5列的Locked=False,第6~10列的Locked=True。
现在焦点第2行的第1列上,如果我用鼠标点击Locked=False的单元格,例如第2行的第2列,焦点需要移动到第2行的第2列上,
如果我使用键盘的右箭头按键,焦点需要跨过Locked=False的列,移动到第2行的第6列上,
大体就是这个模式,如果鼠标控制时,可以点击任何单元格,焦点移动过去,
如果使用键盘的上、下、左、右、以及Tab键控制,焦点需要跨过Locked=False的单元格,移动到下一个Locked=True的单元格。
以上就是遇到的问题,麻烦版主帮一下忙,谢谢了。

4 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-6-23 10:29:48
沙发
您好,这个需要您重写下上下左右的事件
比如左移
  1.   class MoveLeftction : FarPoint.Win.Spread.Action
  2.     {
  3.         public override void PerformAction(object source)
  4.         {
  5.             if (source is SpreadView)
  6.             {
  7.                 SpreadView spread = (SpreadView)source;
  8.                 SheetView sheet = spread.Sheets[spread.ActiveSheetIndex];


  9.                 if (sheet.SelectionCount == 0 || (sheet.SelectionCount == 1 && sheet.GetSelection(0).ColumnCount == 1 && sheet.GetSelection(0).RowCount == 1))
  10.                 {
  11.                     var col = sheet.ActiveColumnIndex - 1;
  12.                     var row = sheet.ActiveRowIndex;
  13.                     if (sheet.Rows[row].Locked)
  14.                     {
  15.                         return;
  16.                     }

  17.                     while (true)
  18.                     {
  19.                         if (col > 0)
  20.                         {
  21.                             if (sheet.Cells[row, col].Locked == false && sheet.Columns[col].Locked == false)
  22.                             {
  23.                                 break;
  24.                             }
  25.                             else
  26.                             {
  27.                                 col--;
  28.                             }
  29.                         }
  30.                         else
  31.                         {
  32.                             break;
  33.                         }
  34.                     }

  35.                     if (sheet.Cells[row, col].Locked == false)
  36.                     {
  37.                         sheet.ClearSelection();
  38.                         sheet.SetActiveCell(row, col);
  39.                     }
  40.                 }
  41.                 else
  42.                 {
  43.                     sheet.ClearSelection();
  44.                     sheet.SetActiveCell(sheet.ActiveRowIndex, sheet.ActiveColumnIndex);
  45.                 }
  46.             }
  47.         }
  48.     }
复制代码

初始化中添加
  1.             InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenFocused);
  2.             ActionMap am = fpSpread1.GetActionMap();
  3.             im.Put(new Keystroke(Keys.Left, Keys.None), "MoveLeft");
  4.             am.Put("MoveLeft", new MoveLeftction());
复制代码
回复 使用道具 举报
dlerror
中级会员   /  发表于:2016-6-23 10:32:52
板凳
dexteryao 发表于 2016-6-23 10:29
您好,这个需要您重写下上下左右的事件
比如左移

谢谢版主帮忙,我试一下。
回复 使用道具 举报
dlerror
中级会员   /  发表于:2016-6-23 10:36:47
地板
dexteryao 发表于 2016-6-23 10:29
您好,这个需要您重写下上下左右的事件
比如左移

版主,我们使用的VB.net,这段代码是不是简单改一下就能使用?
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-6-23 10:54:49
5#
嗯,你去文档里看下 Using Input Maps with Action Maps 这个章节 ,里面有 vb代码
Spread Windows Forms 9.0 Product Documentation > Developer's Guide > Managing Keyboard Interaction > Using Input Maps with Action Maps

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部