我们的工作簿是服务器生成的SpreadsheetML,它不能包含任何 VBA代码.不幸的是,创建本机Excel文件或Excel 2007 XML文件也不是一种选择.
因此,我有一个Excel加载项(VBA,而不是XLL),我们的每个用户都会安装这些加载项以添加我们的工作簿所需的一些额外的UDF等.
这很好用,但是现在我需要有一个宏,每次用户更改任何单元格中的文本时都需要执行,无论他们当时正在使用什么工作簿.
到目前为止,我已在我的加载项中创建了一个新的类模块(SheetChangeHandler),其代码如下:
Option Explicit
Private WithEvents App As Application
Private Sub Class_Initialize()
Set App = Application
End Sub
Private Sub App_SheetChange(ByVal Sh As Object, ByVal Source As Range)
Debug.Print "Changed"
On Error GoTo Finish
App.EnableEvents = False
DoWorkOnChangedStuff Sh, Source
Finish:
App.EnableEvents = True
End Sub
Run Code Online (Sandbox Code Playgroud)
在我的加载项中,我添加了一行来实例化新类:
Public MySheetHandler As New SheetChangeHandler
Run Code Online (Sandbox Code Playgroud)
我的理解是,这应该使Excel 为所有打开的工作簿发送Add-In 所有 SheetChange事件,而不需要包含任何宏代码的工作簿.
但它没有工作......没有调试行,当我更改任何工作表上的单元格时,我的DoWorkOnChangedStuff代码没有被调用.
有任何想法吗?
我在浏览并发现这篇博文:
http://erikej.blogspot.com/2010/04/version-3-of-exportsqlce-now-available.html
(如果您使用SQL Server CE,那么这是一个很好的补充.)
在那篇文章中,我看到了SSMS的屏幕截图,结果中有图像.
![]()
这是怎么做到的?我的数据库中有图像(通过内存流序列化的PNG文件),但是当我选择图像列时,我只看到数字.
我需要知道如何开始编写基于插件架构的应用程序.我的意思是如何编写基本代码,让其他人通过添加他们编写的插件来开发应用程序.我知道在c ++中这样做有一些问题.大多数人使用python之类的其他语言将插件添加到他们的c ++应用程序中.
我习惯使用RockScroll(或MetalScroll),但当我开始使用ReSharper时,我的RockScroll开始显示一些错误.嗯,这是另一个讨论的范围/sf/ask/76264541/.
但我的问题是相关的,因为现在没有MetalScroll我无法突出显示所有事件,我认为在许多情况下非常有用.
有人为VS2010或ReSharper设置了另一个相同或更好的插件吗?
我试图将DI(使用Autofac)引入现有的Windows窗体应用程序.
此应用程序具有基本的插件体系结构,其中每个插件都显示其自己的表单.启动时,应用程序扫描已注册的程序集以查找实现的类型,IPlugin然后使用Activator.CreateInstance以下命令激活它们:
public interface IPlugin
{
Form MainForm { get; }
}
Run Code Online (Sandbox Code Playgroud)
我无法改变这个给定的框架.这意味着,每个插件类都通过非DI方式实例化,在我看来,因此我必须为每个插件引导一个单独的DI容器.
我的问题是,ContainerBuilder每个插件创建一个单独的容器OK还是合理有效吗?(将有大约10种不同的插件.)或者是否应该只有一个DI容器用于整个应用程序?
我在下面提供了一些当前解决方案的示例代码.
using Autofac;
using System.Windows.Forms;
public class Plugin : IPlugin // instantiated by Activator
{
public Form MainForm { get; private set; }
public Plugin() // parameter-less constructor required by plugin framework
{
var builder = new ContainerBuilder();
builder.RegisterModule(new Configuration());
var container = builder.Build();
MainForm = container.Resolve<MainForm>();
// ^ preferred to new MainForm(...) because this …Run Code Online (Sandbox Code Playgroud) 我有一个outlook addin,它在Outlook Explorer的右侧添加了一个自定义任务窗格.在任务窗格中,我添加了一个包含ElementHost的UserControl.ElementHost具有一个带有许多WPF元素的WPF UserControl作为Child.
插件工作得很好,除非我调整自定义任务窗格以减小其大小,控件的内容通常不会正确重新绘制.相反,我在自定义任务窗格上获得了白色矩形.在附图中可以看到这方面的一个例子.对我来说真正奇怪的是,矩形的位置不仅限于ElementHost的内容,而是任务窗格的整个内容 - 您可以看到顶部矩形覆盖了任务窗格标题栏的下半部分.
什么可能导致问题以及如何解决问题?
谢谢,
格雷戈尔

我见过Outlook 的jello-dashboard,它为Outlook添加了Getting Things Done(GTD)功能.我认为它只使用javascript来执行此操作(使用extjs).以前我认为MS产品的任何加载开发都必须在C#或其他MS技术之一上使用VBA.我查看了一些jello-dashboard js文件但是却无法看到(或理解)它使用我认为是修改Outlook行为的API.
这一切都希望创建一个加载项,它将为Outlook添加类似功能的美味,即使用标记云方法过滤电子邮件(基于Outlook类别)
我很感激,如果有人指出我可以在这个javascript => Outlook连接上找到信息/示例/教程的地方.我在虚拟网络上没有运气,但从无知的角度出发,我的搜索可能会很糟糕.
最好的问候/ Colm
我正在开发一个需要AppDomain进程间进程和进程间进程内部通信的项目.是的......我知道...... NET Remoting被广泛认为是一种传统技术,但我面临两个非常特殊的问题,也许在这些情况下,WCF并不是NET Remoting的完全替代品.
1)app -main进程间进程内通信
我正在开始的应用程序启动,需要搜索并加载一个更多的插件.我希望在单独的AppDomain中加载每个插件.我需要一种方法在他的AppDomain中创建每个Addin实例,并在某个时刻调用此实例的一些接口方法.NET Remoting是唯一的方法,对吧?此外,如果我们希望应用System.Addins范例,显然只基于NET Remoting并且没有标记为过时...
2)进程间 - 机器内通信
在这里,我可以肯定地从我的应用程序中公开WCF服务,并使用命名管道从我的客户端调用此服务.
我真正想做的是从我的应用程序中公开一个对象模型,这样我的应用程序就可以从一些.NET客户端自动化,就像Excel公开的OLE/COM Automation对象模型一样.任何COM客户端都可以获得对Excel.Application的对象引用,并查询打开的文档,打开一些新文档等等.
我认为WCF以独立于平台的方式进行通信是很好的.但在这种情况下,我只需要在同一台机器上从Net客户端与Net应用程序进行通信.我认为,WCF服务哲学不允许使用对象,集合,字段,静态成员,方法重载来公开富对象模型......或者我错了?
请原谅我的坏英语和我的新手问题.
我倾向于使用Regionerate来重新组织我的代码文件.我唯一的问题是我无法在VS2012注册.我完全放弃了VS2010而转而支持VS2012,因为只需运行一个宏来重新组织代码文件就不用担心了.我之前从未尝试过编写VS插件,所以我对对象模型或者如何注册并不熟悉 - 似乎旧的插件比VS2010扩展更复杂!我还查看了WIX设置XML并尝试复制注册表项无济于事.
有没有人知道如何在VS2012中注册Regionerate,或者是否有提供相同功能的替代(免费和维护!)扩展?
我有一个C#Excel加载项项目"MyExcelAddIn",它有一个公共方法Foo()来做复杂的事情.出于测试目的,加载项还定义了一个工具栏按钮,该按钮连接到Foo(),因此我可以测试它并验证单击按钮调用Foo()并执行我想要它做的事情.这可以.
现在我想从C#Windows Forms项目中调用此方法.在Windows窗体项目中,我可以创建一个Excel实例并使其可见并验证我的VSTO加载项是否正在运行,因为我可以看到该按钮并且它可以正常工作.但我无法弄清楚如何从Windows窗体项目以编程方式调用Foo().我已经google了一点,得到了"MyExcelAddIn"COMAddIn对象,但无法解决如何调用Foo().
它看起来像这样:
// Create Excel and make it visible
Application excelApp = new Application();
excelApp.Visible = true;
// I know my VSTO add-in is running because I can see my test button
// Now get a reference to my VSTO add-in
Microsoft.Office.Core.COMAddIns comAddIns = _excelApp.COMAddIns;
object addinName = "MyExcelAddIn";
Microsoft.Office.Core.COMAddIn myAddin = comAddIns.Item(ref addinName);
// This works, but now what? How do I make a call on myAddin?
// Note that myAddin.Object is null...
Run Code Online (Sandbox Code Playgroud)
所以我想知道如何从我的Windows窗体应用程序中调用Foo().请注意,我可以完全控制Windows窗体应用程序和加载项,我怀疑我必须对它们(尤其是加载项)进行更改,但我不知道如何执行此操作.
请注意,这是一个VS2008 C#应用程序,我正在使用Excel 2003.