我尝试创建一个VSTO加载项。在其中,我将工作表对象存储在列表中。对于我的Addin,使用延迟的函数调用在自己的线程中执行它很重要。因此,当我打电话时,TestClass.run()
我会遍历工作表列表两次,第一次是在调用延迟函数之前,其次是在延迟函数中。第二个调用不能匹配工作表实例。我怎样才能做到这一点?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;
using System.Timers;
namespace Ventron.VRange
{
public class TestClass
{
private static List<OuterWorksheet> sheetList = new List<OuterWorksheet>();
public static void run(Range range)
{
TestClass.sheetList.Add(new OuterWorksheet(range.Worksheet));
TestClass.getWorkSheet(range.Worksheet);
ElapsedEventHandler delayedFn = delegate(object sender, ElapsedEventArgs e)
{
System.Timers.Timer theTimer = (System.Timers.Timer)sender;
if (theTimer.Enabled)
{
theTimer.Stop();
theTimer.Enabled = false;
theTimer.Dispose();
theTimer = null;
TestClass.getWorkSheet(range.Worksheet);
}
};
System.Timers.Timer timerInstance = new System.Timers.Timer(1);
timerInstance.Elapsed += new System.Timers.ElapsedEventHandler(delayedFn);
timerInstance.Interval = 1;
timerInstance.Enabled = true;
}
internal static OuterWorksheet getWorkSheet(Worksheet worksheet)
{
System.Diagnostics.Debug.Write("*****************************\n");
System.Diagnostics.Debug.Write(worksheet.CodeName + "\n");
foreach (OuterWorksheet outerWS in TestClass.sheetList)
{
System.Diagnostics.Debug.Write(outerWS.worksheet.CodeName + "\n");
if (outerWS.worksheet.Equals(worksheet))
{
System.Diagnostics.Debug.Write("Worksheets are equal\n");
return outerWS;
} else
System.Diagnostics.Debug.Write("Worksheets are not equal\n");
}
return null;
}
internal class OuterWorksheet
{
public Worksheet worksheet { get; private set; }
public OuterWorksheet(Worksheet worksheet)
{
this.worksheet = worksheet;
}
}
}
}
输出为:
*****************************
Sheet5
Sheet5
Worksheets are equal
*****************************
Sheet5
Sheet5
Worksheets are not equal
谢谢!
每次获取工作表时,它都会围绕由Excel公开的COM对象生成一个新的包装实例,因此,按引用它们永远不会相等。Excel需要唯一的工作表名称,因此在检查是否相等时只需比较名称即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句