从excel粘贴到WinForms的电子表格工具删除了对目标单元格的验证



我在电子表格齿轮上的一个单元格上只有数字验证,它在输入数字以外的任何东西时都出错,但我面临的问题是,用户只需在excel中键入他喜欢的任何东西,并将单元格本身粘贴到电子表格齿轮表上,导致它失去验证。

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

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

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

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

例如,您可以有效地强制使用Edit ->选择性粘贴……→每当调用Paste command时,Values命令,这样格式就不会被更改,这可能会删除单元格验证。您可以通过PasteType enum查看其他粘贴选项。例子:

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 CommandRange.Paste command is invoked, we'll instead invoke a 
        // CommandRange.PasteSpecial with "Paste Values" (PasteType.Values) so that 
        // values are pasted but not cell formatting, which could remove cell 
        // validation.
        return new CommandRange.PasteSpecial(range, PasteType.Values, 
            PasteOperation.None, false, false);
    }
    ...
}

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

  new MyCommandManager(workbookView.ActiveWorkbookSet);

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

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

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();
                }
            }
        }

最新更新