找回密码
 立即注册

QQ登录

只需一步,快速开始

75139132

注册会员

12

主题

38

帖子

106

积分

注册会员

积分
106
75139132
注册会员   /  发表于:2021-8-3 11:09  /   查看:4051  /  回复:9
10金币
本帖最后由 75139132 于 2021-8-3 11:25 编辑

c1flexgrid 的autoclipboard属性为true 时候   表格可以复制 粘贴整行的内容  但是当一行的某一列visible属性 为flase 时候  列会对不上  

举个简单的例子C1flexgrid 有 ABCD四列  我从excel复制1行 3列  粘贴到C1flexgrid时候  ABC列有数据
但是我吧C1flexgrid的B列的visible 设置flase时候  还复制excel复制1行 3列    就变成 AC显示数据     visible的B也接收到数据了  。
怎么可以让visible=flase的列 不接收据能?

最佳答案

查看完整内容

这个目前没有其他的办法,如果只是要粘贴值的话,可以禁用autoclipboard, 通过代码从剪切板获取文本,然后自己循环设置到未隐藏的单元格中,代码如下,在PreviewKeyDown事件中判断ctrl+v

9 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-8-3 11:09:48
来自 2#
这个目前没有其他的办法,如果只是要粘贴值的话,可以禁用autoclipboard,

通过代码从剪切板获取文本,然后自己循环设置到未隐藏的单元格中,代码如下,在PreviewKeyDown事件中判断ctrl+v

  1. private void C1FlexGrid3_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  2.         {
  3.             
  4.             if(e.KeyCode== Keys.V&&e.Modifiers== Keys.Control)
  5.             {
  6.                 var pasteStr=Clipboard.GetText();
  7.                 var rows= pasteStr.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
  8.                 var colscount = rows[0].Split(new string[] { "\t" }, StringSplitOptions.None).Length;
  9.                
  10.                 var hitinfo=c1FlexGrid3.HitTest();
  11.                 var visiablerows = getVisiableRowList(hitinfo.Row, rows.Length);
  12.                 var visiablecols = getVisiableColList(hitinfo.Column, colscount);
  13.                 for (int i=0;i< rows.Length; i++)
  14.                 {
  15.                     var values = rows[i].Split(new string[] { "\t" }, StringSplitOptions.None);
  16.                     for (int j = 0; j < values.Length; j++)
  17.                     {
  18.                         c1FlexGrid3[visiablerows[i], visiablecols[j]] = values[j];

  19.                     }
  20.                 }
  21.             }
  22.         }
  23.         private int[] getVisiableRowList(int startrow,int rowcount)
  24.         {
  25.             List<int> rowlist = new List<int>();
  26.             while (startrow<c1FlexGrid3.Rows.Count&& rowlist.Count<rowcount)
  27.             {
  28.                 if (c1FlexGrid3.Rows[startrow].Visible)
  29.                     rowlist.Add(c1FlexGrid3.Rows[startrow].Index);
  30.                 startrow++;
  31.             }
  32.             return rowlist.ToArray();

  33.         }
  34.         private int[] getVisiableColList(int startcol, int colcount)
  35.         {
  36.             List<int> collist = new List<int>();
  37.             while (startcol < c1FlexGrid3.Cols.Count && collist.Count < colcount)
  38.             {
  39.                 if (c1FlexGrid3.Cols[startcol].Visible)
  40.                     collist.Add(c1FlexGrid3.Cols[startcol].Index);
  41.                 startcol++;
  42.             }
  43.             return collist.ToArray();

  44.         }
复制代码




回复 使用道具 举报
75139132
注册会员   /  发表于:2021-8-3 17:16:26
3#
好的 我先试试  谢谢
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-8-3 17:34:57
4#
不客气
回复 使用道具 举报
75139132
注册会员   /  发表于:2021-8-4 15:23:26
5#
上面的代码  不能复制c1FlexGrid的内容  并且内容查出 会报错  

我在想 还是用autoclipboard等于true  在某一列的visible成为flase的时候   哪个属性能改变他的列的位置么  ?

比如 一个c1FlexGrid的列有ABCDE  当B列的visible变成flase时候  列顺序变成ACDEB   不知道有哪个属性能改变列的位置么 ?
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-8-4 16:44:42
6#
是的,根据你帖子开始问到的情况,上面的代码也只是针对于从excel中向flexgrid复制数据这种情况,且只能复制值。

C1支持移动列,按照你的思路可以用下面的代码,同样的,请将autoclipboard设置为false,然后手动粘贴

  1.         private void C1FlexGrid3_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
  2.         {
  3.             
  4.             if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
  5.             {
  6.                 c1FlexGrid3.Cols.Move(2, 6);
  7.                 c1FlexGrid3.Paste();
  8.                 c1FlexGrid3.Cols.Move(6, 2);

  9.                
  10.             }
  11.         }
复制代码

回复 使用道具 举报
75139132
注册会员   /  发表于:2021-8-5 10:16:22
7#
autoclipboard  等于flase的话复制不到c1flexgrid的内容  只能复制excel    有办法达到autoclipboard的效果吗
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-8-5 10:42:31
8#
autoclipboard是针对于Ctrl+V起作用的,如果设置为true的话,就没有办法避免粘贴到隐藏行的情况,
最多就是另外自定义一个组合快捷键,用上面的代码手动 Paste,然后和用户说明粘贴Excel时用自定义的快捷键,不要用Ctrl+V

除此之外没有其他办法了
回复 使用道具 举报
75139132
注册会员   /  发表于:2021-8-6 08:47:20
9#
谢谢了 我再想想其他办法吧。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-8-6 09:06:44
10#
不客气
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部