【问题标题】:c# .net interop beforesave not firingc# .net interop beforesave 不触发
【发布时间】:2012-06-08 19:50:14
【问题描述】:

基本上我想创建一个excel管理软件,客户可以将他们的excel文件直接保存到数据库中。为了实现这一点,我尝试用某个模板或文件打开一个excel工作表,然后让用户修改它,当用户保存他们的工作时,它会自动将excel程序保存到数据库中。

所以到目前为止我所做的是在保存之前测试事件并且它没有触发:

    static void Main()
    {
        System.Windows.Forms.Application.EnableVisualStyles();
        System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
        //Application.Run(new LoginForm());

        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

        Microsoft.Office.Interop.Excel.Application a = new 
                              Microsoft.Office.Interop.Excel.Application();


        Workbook wb = a.Workbooks.Open("\\\\doctor-pc\\excel\\test1.xlsx", 
                  Type.Missing, false, Type.Missing, Type.Missing, Type.Missing, 
                    Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing);

        wb.BeforeSave += new WorkbookEvents_BeforeSaveEventHandler(wb_BeforeSave);

        a.Visible = true;

    }

    static void wb_BeforeSave(bool SaveAsUI, ref bool Cancel)
    {
        MessageBox.Show("Save");
    }

有人可以帮我解决这个问题吗?

我不能使用应用级插件,因为我只想让行为影响程序打开的文档,我不能使用文档级插件,因为程序可能会打开很多种类的文件和模板。

【问题讨论】:

    标签: c# .net excel visual-studio-addins excel-interop


    【解决方案1】:
    1. 您需要维护对wb 变量的实时引用(例如,通过将其提升为字段)。如果Workbook 实例超出范围并被垃圾回收,那么它的事件将永远不会被触发。

    2. 您需要保持 .NET 应用程序打开,以便能够接收和处理 BeforeSave 事件。您可以通过创建一个 EventWaitHandle 来实现此目的,该 Main 方法会阻塞 Main 方法,直到 wb_BeforeSave 事件处理程序发出信号。

    【讨论】:

    • 该死!愚蠢的错误,我请求您的原谅,我的主,谢谢!
    猜你喜欢
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多