pblandscape 发表于 2017-3-29 18:51:46

如何才能达到筛选后跨行拖拉的问题

本帖最后由 pblandscape 于 2017-3-29 18:55 编辑

参见附件,如何才能达到筛选后跨行拖拉的问题

dexteryao 发表于 2017-3-30 09:37:26

Spread WPF没有提供这样的功能。一个解决方案是在填充前缓存数据,填充后判断如果是被过滤的行就恢复。

      object[,] cacheFillRangeData;
      private void GcSpreadSheet1_DragFillBlock(object sender, GrapeCity.Windows.SpreadSheet.UI.DragFillBlockEventArgs e)
      {
            cacheFillRangeData = gcSpreadSheet1.ActiveSheet.GetArray(e.FillRange.Row, e.FillRange.Column, e.FillRange.RowCount, e.FillRange.ColumnCount);
      }

      private void GcSpreadSheet1_DragFillBlockCompleted(object sender, GrapeCity.Windows.SpreadSheet.UI.DragFillBlockCompletedEventArgs e)
      {
            if (!gcSpreadSheet1.ActiveSheet.RowFilter.IsFiltered)
            {
                return;
            }
            for (var i = 0; i < e.FillRange.RowCount; i++)
            {
                int row = e.FillRange.Row + i;
                if (gcSpreadSheet1.ActiveSheet.RowFilter.IsRowFilteredOut(row))
                {
                  for (var j = 0; j < e.FillRange.ColumnCount; j++)
                  {
                        int col = e.FillRange.Column + j;
                        gcSpreadSheet1.ActiveSheet.Cells.Value = cacheFillRangeData;
                  }
                }
            }
      }

pblandscape 发表于 2017-3-30 14:56:26

dexteryao 发表于 2017-3-30 09:37
Spread WPF没有提供这样的功能。一个解决方案是在填充前缓存数据,填充后判断如果是被过滤的行就恢复。

有另外一个问题出来了,就是本来我下面的cell是锁定的,也就是不运行他手动修改值的。
结果一拖拉,把下面cell的值替换了,连格式也替换了,
请解决这个问题。

dexteryao 发表于 2017-3-30 15:21:08

将格式页缓存起来。然后恢复就好了。

      object[,] cacheFillRangeData;
      GrapeCity.Windows.SpreadSheet.Data.StyleInfo[,] cacheFillRangeStyle;
      private void GcSpreadSheet1_DragFillBlock(object sender, GrapeCity.Windows.SpreadSheet.UI.DragFillBlockEventArgs e)
      {
            if (gcSpreadSheet1.ActiveSheet.RowFilter.IsFiltered)
            {
                cacheFillRangeData = gcSpreadSheet1.ActiveSheet.GetArray(e.FillRange.Row, e.FillRange.Column, e.FillRange.RowCount, e.FillRange.ColumnCount);
                cacheFillRangeStyle = new GrapeCity.Windows.SpreadSheet.Data.StyleInfo;
                for (var i = 0; i < e.FillRange.RowCount; i++)
                {
                  int row = e.FillRange.Row + i;
                  if (gcSpreadSheet1.ActiveSheet.RowFilter.IsRowFilteredOut(row))
                  {
                        for (var j = 0; j < e.FillRange.ColumnCount; j++)
                        {
                            int col = e.FillRange.Column + j;
                            cacheFillRangeStyle = gcSpreadSheet1.ActiveSheet.GetStyleInfo(row, col, GrapeCity.Windows.SpreadSheet.Data.SheetArea.Cells);
                        }
                  }
                }
            }
      }

      private void GcSpreadSheet1_DragFillBlockCompleted(object sender, GrapeCity.Windows.SpreadSheet.UI.DragFillBlockCompletedEventArgs e)
      {
            if (gcSpreadSheet1.ActiveSheet.RowFilter.IsFiltered)
            {
                for (var i = 0; i < e.FillRange.RowCount; i++)
                {
                  int row = e.FillRange.Row + i;
                  if (gcSpreadSheet1.ActiveSheet.RowFilter.IsRowFilteredOut(row))
                  {
                        for (var j = 0; j < e.FillRange.ColumnCount; j++)
                        {
                            int col = e.FillRange.Column + j;
                            gcSpreadSheet1.ActiveSheet.Cells.Value = cacheFillRangeData;
                            gcSpreadSheet1.ActiveSheet.SetStyleInfo(row, col, cacheFillRangeStyle);
                        }
                  }
                }
                cacheFillRangeData = null;
                cacheFillRangeStyle = null;
            }
      }

pblandscape 发表于 2017-3-30 15:58:14

dexteryao 发表于 2017-3-30 15:21
将格式页缓存起来。然后恢复就好了。

我的意思是,下面的cells是locked状态的,不允许通过拖拉来改值

dexteryao 发表于 2017-3-30 16:29:47

这个做不到,在没有设置保护的情况下,locked其实是不起作用的,设置了保护后拖拽只能在连续的没locked区域进行。
如果您想实现不保护还能跨域locked 拖拽,可是参考上面的代码,判断如果单元格是locked也恢复原来的值。
页: [1]
查看完整版本: 如何才能达到筛选后跨行拖拉的问题