来自excel的WinForms粘贴的Spreadsheetgear会删除目标单元格上的验证

时间:2014-05-13 17:25:35

标签: c# .net winforms spreadsheetgear

我在spreadsheetgear上的一个单元格上只有数字验证,它在键入除数字之外的任何内容时出错,但我遇到的问题是用户只需在excel中键入他喜欢的任何内容并将单元格粘贴到电子表格工作表导致其失去验证。

现在,我通过其他线程发现你可以禁用所有"编辑"对单元格的操作,但我想让用户能够从excel中粘贴单元格。

所以,我的问题是,是否有一个事件在粘贴单元格上被击中?我可以使用该事件来验证数据并生成自定义消息。我并不关心excel错误消息,因为我打算处理onError事件,并为其他情况生成相同的自定义错误消息。

完成任务的任何其他方法也会有所帮助。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

调用粘贴操作时不会触发事件。至少,不是一个对你的场景有用的东西。但是,粘贴会生成CommandRange.Paste命令。因此,您可以将自己的自定义CommandManager附加到WorkbookView的工作簿集,并覆盖粘贴命令的默认行为,以执行您的任何特殊要求。

例如,您可以有效地强制编辑 - >粘贴特殊... - >每当调用粘贴命令时,值命令,以便不更改格式,这可能会删除单元格验证。您可以浏览PasteType枚举以获取其他粘贴选项。例如:

using SpreadsheetGear;
using SpreadsheetGear.Commands;

public class MyCommandManager : CommandManager
{
    internal MyCommandManager(IWorkbookSet workbookSet)
        : base(workbookSet)
    { }

    ...

    // Gets called anytime a Paste command is invoked (i.e., Ctrl+V, context 
    // menu item, WorkbookView.Paste(), etc)
    public override Command CreateCommandPaste(IRange range)
    {
        // Anytime a Paste command is invoked, we'll force a "Paste Values" so 
        // that values are pasted but not cell formatting, which could remove 
        // cell validation.
        return new MyCommandPasteSpecial(range, PasteType.Values, 
            PasteOperation.None, false, false);
    }
    ...
}

当您创建MyCommandManager的实例时,它将自动成为指定IWorkbookSet的CommandManager,即:

  new MyCommandManager(workbookView.ActiveWorkbookSet);

显然,这种方法意味着您想从Excel中提取的任何格式都会丢失。

答案 1 :(得分:0)

找到另一个解决方案。可以帮助别人。

void wbViewWorkflowData_KeyDown(object sender, KeyEventArgs e)
        {
            WorkbookView wbView = (WorkbookView)sender;

            if (e.Control && e.KeyCode == Keys.V)
            {
                wbView.GetLock();
                try
                {
                    e.SuppressKeyPress = true;
                    wbView.PasteSpecial(PasteType.Values, PasteOperation.None, false, false);
                    //Additional stuff here.
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    wbView.ReleaseLock();
                }
            }
        }

这对我来说很有效。