我希望能够通过加载项本身的一些 VBA 代码访问 PowerPoint 加载项文件(保存为“PowerPoint 加载项 (*.ppa)”的演示文稿)的文档属性。
如果它有助于理解问题,我实际尝试做的是读取存储加载项版本号的自定义文档属性,以便我可以在对话框中显示它。
在 Word 和 Excel 中,我可以使用ThisDocument&执行此操作ThisWorkbook,它们都返回对包含正在运行的代码的文档的引用。但是,ThisPresentationPowerPoint 中没有等效项。
对于标准的 PowerPoint 演示文稿或模板,我可以使用ActivePresentation. 但是,此方法不适用于加载项。
有任何想法吗?拜托,没有关于我应该在哪里贴版本号的建议:-)
可能重复:
在C#中使用语句嵌套
我是usingC#声明的忠实粉丝.我发现这个:
using (var foo = new ObjectWhichMustBeDisposed())
{
other code
}
Run Code Online (Sandbox Code Playgroud)
......比这更具可读性:
var foo = new ObjectiWhichMustBeDisposed();
try
{
other code
}
finally
{
foo.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
它不仅更具可读性,而且还防止foo在using声明之后(即在声明之后)意外使用变量,而在第二个示例中foo可以在它被处置之后使用.
using但是,一个问题是,如果正在创建大量的一次性对象,它往往会导致非常嵌套的代码.例如:
using (var foo = new ObjectWhichMustBeDisposed())
{
using (var bar = new ObjectWhichMustBeDisposed())
{
other code
}
}
Run Code Online (Sandbox Code Playgroud)
如果两个对象的类型相同,那么您可以将它们组合成一个using语句,如下所示:
using (var foo = new ObjectWhichMustBeDisposed(),
bar = new ObjectWhichMustBeDisposed())
{
other code
}
Run Code Online (Sandbox Code Playgroud)
但是,如果对象的类型不同,那么这将不起作用.
我的问题是,是否可以达到类似的目的:
using (var foo = …Run Code Online (Sandbox Code Playgroud) 在PowerPoint 2010或Word 2010中,当我选择"插入" - >"图表"时,它会创建一个带有Excel工作表的新图表.
如果我将一个宏添加到Excel工作表,当我关闭工作表并重新打开它时,这似乎被丢弃了.
但是,它是可能有宏的图表,因为我也有一些Word文档和我在Office 2003中,它已经嵌入Excel图表与宏创建PowerPoint演示文稿.当我将它们转换为Office 2010时,它们看起来就像"普通"Office 2010图表,但宏保留了下来.
在我看来,当您选择插入时创建的嵌入式图表 - >图表是"pptx"格式而不是"pptm"格式,因此不会保存宏.
(如果我查询ActiveWorkbook.FileFormat,我得到"51",这是"Open Xml Spreadsheet";这确实是"pptx",而不是"用Mac打开Xml电子表格",即"52").
如何插入带有"pptm"行为的图表?或者改变现有图表的行为?
注意:我不想插入图表"对象",因为这意味着图表在主机应用程序中不可编辑(它只是插入一个需要"打开"以便编辑它的Excel图表).
让我先行一步......我可以通过以下方法实现我想要的目标:
现在您有一个"本机"Word或PowerPoint 2010图表,您可以直接在Word或PowerPoint中编辑它.如果单击图表并选择图表工具 - >设计 - >编辑数据,则打开的Excel工作表将包含您在步骤4中创建的宏.成功!
现在,有没有人有更简单的方法?
如果我在C#/ .NET类库中定义一个类,那么通过使其可见,我可以实例化该类并使用COM从VBA调用其方法.
有没有办法从VBA 调用这样的类的静态方法?
我正在使用ASP.NET SQL成员资格提供程序.所以,有一个aspnet_Users表格,其中包含每个用户的详细信息.(实际上,该aspnet_Membership表似乎包含了大部分实际数据).
我现在想在我的数据库中存储一些每用户信息,所以我想我只是创建一个带有UserId(GUID)列和FK关系的新表aspnet_Users.但是,我后来发现我无法轻易访问,UserId因为它没有通过成员资格API公开.(我知道我可以通过它访问它ProviderUserKey,但似乎API正在抽象出内部UserID的支持UserName,而且我不想过分反对这个问题).
所以,我想我应该LoweredUserName在我的表中添加一个列,并创建一个FK关系来aspnet_Users使用它.Bzzzt.又错了,因为同时有一个独特的指数aspnet_Users是包括了LoweredUserName,它也包括了ApplicationId-所以为了创建我的FK关系,我需要有一个ApplicationId在我的表列了.
起初我想:很好,我只处理一个应用程序,所以我只是添加这样一个列并给它一个默认值.然后我意识到这ApplicationId是一个GUID,所以这样做会很痛苦.确切地说并不难,但在我推出我的数据库之前,我无法预测GUID将会是什么.
我觉得我错过了一些东西,或者说错误的方式.那我应该怎么办?
在VBA项目中,您可以使用工具箱窗口创建UserForm并向其添加控件.默认情况下,工具箱窗口包含简单的表单控件,如Label,TextBox,ListBox等.
如果它们已安装在您的计算机上,您可以添加其他控件:右键单击工具箱上的"其他控件"可显示整个控件的冗余部分.但是,这并未说明它们来自何处.
我很想知道在安装了Office 2007的计算机上可以保证哪些控件可用.它只是标准的,还是一些"附加控件"也保证可用(因为它们与Office 2007一起提供,或者因为它们存在于Office 2007将运行的所有Windows版本上)?
例如,我很惊讶即使在Office 2007中也没有树视图控件.在我的"其他控件"列表中,我看到"Microsoft TreeView Control v6",但我不知道我是否可以依赖于所有人我的Office 2007用户.
我有一些POCO对象,我在EF Code First上下文中使用.所以,当我用数据填充它们时,我实际上是处理EF代理对象而不是POCO本身.
我有一个ASP.NET MVC4 ApiController,它返回我的POCO对象,我将在客户端应用程序中使用它.
我的"GET"方法看起来像这样:
// GET api/Clients/5
public Client GetClient(int id)
{
Client client = db.Clients.Find(id);
if (client == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return client;
}
Run Code Online (Sandbox Code Playgroud)
这实际上不起作用,因为当序列化程序尝试序列化Client对象时,它实际上正在处理EF代理版本,这导致它打嗝.请参阅ApiController可以返回带有其他对象集合的对象吗?
所以,我可以通过这样做来关闭代理生成DbContext:
db.Configuration.ProxyCreationEnabled = false;
Run Code Online (Sandbox Code Playgroud)
这确保我正在处理POCO而不是代理.但是,现在我的Client类的大多数成员都没有填充,因为它是EF代理,它懒得加载那些对我来说.
所以我真正想要的是使用EF代理类来获取数据,然后在最后一刻从我的方法返回原始POCO.
如果不在代码中手动创建整个对象(包括任何嵌套对象),我该怎么做?当然必须有一个简单的方法 - 或者至少是某种帮助类?
注意:请参阅底部的编辑.我是一个白痴.
我有以下代码来处理标记名称集并识别/处理新标记:
IEnumberable<string> tagNames = GetTagNames();
List<Tag> allTags = GetAllTags();
var newTagNames = tagNames.Where(n => !allTags.Any(t => t.Name == n));
foreach (var tagName in newTagNames)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
...并且这很好,除了它没有处理有一个名为"Foo"的标签并且列表包含"foo"的情况.换句话说,它没有进行不区分大小写的比较.
我更改了测试以使用不区分大小写的比较,如下所示:
var newTagNames = tagNames.Where(n => !allTags.Any(t => t.Name.Equals(n, StringComparison.InvariantCultureIgnoreCase)));
Run Code Online (Sandbox Code Playgroud)
...当foreach运行(并调用MoveNext)newTagNames时,我突然抛出一个异常.例外说:
序列没有元素
我很困惑.为什么要foreach坚持序列非空?如果我打电话First(),我希望看到这个错误,但是在使用时却没有foreach?
编辑:更多信息.
这一刻变得更加怪异.因为我的代码是异步方法,而且我很迷信,所以我认为引发异常的点与它被捕获和报告的点之间存在太大的"距离".所以,我对一个有问题的代码进行了try/catch,希望能够验证被抛出的异常是我认为的那样.
所以现在我可以在调试器中逐步进入foreach行,我可以验证序列是空的,并且我可以直接进入调试器突出显示单词"in"的位.还有一步,我在我的异常处理程序中.
但是,不是我刚刚添加的异常处理程序,不!它落在我最外层的异常处理程序中,而不访问我最近添加的异常处理程序!它不匹配catch (Exception ex),也不匹配普通catch.(我也确实放了一个finally,并证实它确实在出路时访问了它).
我一直认为,像这样的异常处理程序会捕获任何异常.我现在很害怕.我需要一个成年人.
编辑2:
好吧,嗯,误报......我的本地try/catch没有抓住异常只是因为它没有被我想到的代码引发.正如我上面所说,我看到调试器中的执行从直接的"in"跳转foreach到外部异常处理程序,因此我(错误的)假设这就是错误所在.但是,使用空枚举,这只是函数中执行的最后一个语句,并且由于某种原因,调试器没有向我显示函数的跳出或在调用点执行下一个语句 - 这是在事实上导致错误的那个.
向所有回复的人道歉,如果你想创造一个说我是老生常谈的回答,我会乐意接受.也就是说,如果我再次露出我的脸......
如果我有这样的实体:
class Foo
{
[Range(0,100)]
public int Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
......我用EditorFor(m => m.Bar)在MVC视图,它使用HTML5 <input type="number">标签,但不使用min和max该标签的属性.有什么我可以做的,让它使用它们?
我看过有关存储库模式的各种博客文章(以及许多相互矛盾的建议),因此我首先要说的是,在许多人看来,下面的代码可能不遵循存储库模式。然而,这是一个足够常见的实现,无论它是否遵循 Fowler 的原始定义,我仍然有兴趣更多地了解该实现在实践中的使用方式。
假设我有一个项目,其中数据访问是通过如下接口抽象的,该接口提供基本的 CRUD 操作。
public interface IGenericRepository<T>
{
void Add(T entity);
void Remove(T entity);
void Update(T entity);
IEnumerable<T> Fetch(Expression<Func<T,bool>> where);
}
Run Code Online (Sandbox Code Playgroud)
进一步假设我在其之上构建了一个服务层,例如:
public class FooService
{
private IGenericRepository<Foo> _fooRespository;
...
public IEnumerable<Foo> GetBrightlyColoredFoos()
{
return _fooRepository.Fetch(f => f.Color == "pink" || f.Color == "yellow");
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设我现在需要知道有多少个颜色鲜艳的Foos,但实际上不想枚举它们。理想情况下,我想在我的服务中实现一个CountBrightlyColoredFoos()方法,但是存储库实现让我无法实现这一目标,只能获取所有这些方法并对其进行计数 - 这可能非常低效。
我可以扩展存储库以添加Count()方法,但是我可能需要的其他聚合函数(例如Min()or Max()、or Sum()、or...)怎么样,您明白了。
同样,如果我想获取不同 Foo 颜色的列表 ( SELECT DISTINCT),该怎么办?同样,简单的存储库也无法提供执行此类操作的方法。
保持存储库简单以使其易于测试/模拟是非常值得称赞的,但是如何满足这些要求呢?当然,只有两种方法可以选择 - 更复杂的存储库,或者服务层使用的绕过存储库的“后门”(从而违背了其目的)。
c# ×5
vba ×4
ms-office ×2
powerpoint ×2
.net ×1
asp.net ×1
com ×1
html5 ×1
interop ×1
linq ×1
ms-word ×1
office-2007 ×1
office-2010 ×1
userform ×1
validation ×1