我有以下例程将DataTable转储到Excel工作表中.
private void RenderDataTableOnXlSheet(DataTable dt, Excel.Worksheet xlWk,
string [] columnNames, string [] fieldNames)
{
// render the column names (e.g. headers)
for (int i = 0; i < columnNames.Length; i++)
xlWk.Cells[1, i + 1] = columnNames[i];
// render the data
for (int i = 0; i < fieldNames.Length; i++)
{
for (int j = 0; j < dt.Rows.Count; j++)
{
xlWk.Cells[j + 2, i + 1] = dt.Rows[j][fieldNames[i]].ToString();
}
}
}
Run Code Online (Sandbox Code Playgroud)
无论出于何种原因,在我相对现代的PC上倾销25列和400行的DataTable大约需要10-15秒.占用更长的测试人员的机器.
我有什么办法可以加快这段代码的速度吗?或者互操作本身就很慢?
解决方案:根据Helen Toomik的建议,我修改了方法,它现在应该适用于几种常见的数据类型(int32,double,datetime,string).随意扩展它.处理我的数据集的速度从15秒变为1秒.
private void RenderDataTableOnXlSheet(DataTable dt, Excel.Worksheet …Run Code Online (Sandbox Code Playgroud) 我正在使用.NET Micro Framework开发一个网络管理设备.由于想法是在办公室中拥有一堆设备,因此有时用户必须知道特定设备的IP地址.
所以我一直试图提出如何指出用户的IP地址的想法.唯一的用户界面是4个LED灯,我可以以不同的速度闪烁.
到目前为止,我能想到的最好的想法是:看看IP地址有4个部分,我有4个LED,每个LED负责单个IP地址部分是有意义的.所以对于像192.168.0.34这样的地址,我会让LED1闪烁一次,然后暂停,然后闪烁9次,暂停,然后闪烁2次.然后该动作将转移到LED2,LED2将以类似的方式闪烁168,依此类推.数字0将通过快速闪烁半秒钟来指示.
还有其他想法吗?
我被要求更新过去6年一直在WinXP上运行的VB6应用程序.客户端想要使用Windows 7.到目前为止,应用程序将其设置存储在位于应用程序目录中的INI文件中.XP和7之间的一个关键区别是你不能再写C:\Program Files\AppFolder了.
我试图找出文件系统应该存储设置的位置?鉴于应用程序仍然需要在WinXP上运行,我有点困惑.
在WinXP上,我有以下内容:
C:\Documents and Settings\profilename\Application Data
C:\Documents and Settings\profilename\Local Settings\Application Data
Run Code Online (Sandbox Code Playgroud)
在Windows 7上,我有以下内容:
C:\Users\profilename\AppData\Local
C:\Users\profilename\AppData\LocalLow
C:\Users\profilename\AppData\Roaming
Run Code Online (Sandbox Code Playgroud)
这些文件夹中的每一个都有子文件夹,似乎存储各种产品的设置/文件
那2个问题:
我想检测用户何时插入或移除USB声卡.当这种情况发生时,我已经成功地抓住了这个事件,但是我不知道插入了什么.
我尝试了一个基于这个问题的方法:
string query =
"SELECT * FROM __InstanceCreationEvent " +
"WITHIN 2 "
+ "WHERE TargetInstance ISA 'Win32_PnPEntity'";
var watcher = new ManagementEventWatcher(query);
watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
watcher.Start();
Run Code Online (Sandbox Code Playgroud)
当我通过EventArrived事件收到通知时,我不知道如何确定刚刚插入的设备的实际名称.我已经浏览了每个属性,无法用它做出正面或反面.
我也尝试了不同的查询:
var query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent where EventType = 1 or EventType = 2");
var watcher = new ManagementEventWatcher(query);
watcher.EventArrived += watcher_EventArrived;
watcher.Stopped += watcher_Stopped;
watcher.Query = query;
watcher.Start();
Run Code Online (Sandbox Code Playgroud)
但也无济于事.有没有办法找到插入或删除的设备的名称.
最重要的是,我想知道什么时候插入USB声卡或从系统中删除.它应该适用于Windows 7和Vista(虽然我只会满足于Win7).
编辑:根据获胜提交者的建议,我创建了一个包含所有功能的完整解决方案.
我有一个未排序的字符串列表.我可以将这些项放在数组,List,SortedList等等.
我需要找到在此列表中查找字符串的最快方法.我最好将列表转储到数组中,对其进行排序,然后实现二进制搜索?或者框架是否提供了这样做的方法?
谢谢
PS使用VS2008对抗.NET 2.0
我有一个VB6应用程序,有大量的第三方组件.该应用程序运行良好,但在退出时(并且仅当作为独立的EXE运行时,例如不在IDE中),它会弹出一条错误消息:

我之前看到过这样的错误,但通常会说哪个组件缺少依赖项或未正确注册.
我通过Process Monitor运行它并获得了以下无法找到的文件:

然后就退出了.我用谷歌搜索了它找不到的文件名,似乎找不到任何东西.它似乎在寻找MSComENU,MSComEN和MSCOENU dll的变种.
我检查并重新检查以确保所有第三方组件都存在且它们是 - 应用程序功能正常,如果不存在则不会.
值得注意的是,在VB6代码(Form_Unload事件)的最后一行被触发后发生错误.我知道这是因为最后一行是一个确实出现的消息框.
很多,后来编辑:我终于回到处理问题并通过消除过程找出它(这是一个loooong过程).最后它与任何MSCOMM*.dll条目无关.事实上,我不知道他们为什么还会出现在Process Monitor中.问题要简单得多.
我在主窗体上有几个第三方控件.为了不用大量事件处理代码污染主窗体,我将这些控件委托给一个新类,如下所示:
' declaration code in main form'
Private WithEvents moDelegateObject as clsDelegateObject
' still in the main form, after initialization'
Set moDelegateObject = new clsDelegateObject
With moDelegateObject
Set .ThirdPartyCtlHandler1 = me.ThirdPartyCtl1
Set .ThirdPartyCtlHandler2 = me.ThirdPartyCtl2
Set .ThirdPartyCtlHandler3 = me.ThirdPartyCtl3
end with
' declarations and properties inside of clsDelegateObject'
Private WithEvents moThirdPartyCtlHandler1 as ThirdPartyCtl
Private WithEvents moThirdPartyCtlHandler2 as ThirdPartyCtl
Private WithEvents moThirdPartyCtlHandler3 as ThirdPartyCtl
Public Event …Run Code Online (Sandbox Code Playgroud) 使用Picasa Web API我从我的Google+相册中检索照片并尝试更改时间戳(手机上的时间错误,因此尝试修复):
var service = new PicasaService("exampleCo-exampleApp-1");
service.setUserCredentials("uid", "pwd");
AlbumQuery query = new AlbumQuery(PicasaQuery.CreatePicasaUri("default"));
PicasaFeed feed = service.Query(query);
var entry = (PicasaEntry)feed.Entries.SingleOrDefault(f => f.Title.Text == "Trip to Italy - ALL");
var ac = new AlbumAccessor(entry);
var photoQuery = new PhotoQuery(PicasaQuery.CreatePicasaUri("default", ac.Id));
PicasaFeed photoFeed = service.Query(photoQuery);
PicasaEntry picasaEntry = photoFeed.Entries[0];
ulong timestamp = Convert.ToUInt64(picasaEntry.GetPhotoExtensionValue("timestamp"));
// deduct 9 hours
DateTime dt = FromUnixTime(pa.Timestamp).AddHours(-9);
picasaEntry.SetPhotoExtensionValue("timestamp", Convert.ToString(ToUnixTime(dt)));
var updatedEntry = (PicasaEntry) picasaEntry.Update();
Run Code Online (Sandbox Code Playgroud)
不幸的是,当.Update方法成功时,时间戳不会改变.我也试图改变照片的时区(例如,用户手动操作同样的事情,如http://i.imgur.com/pxYSi9S.png).
我错过了一些简单的事吗?还有另一种方法可以完成同样的事情吗?我也愿意改变照片的时区.
我有一个始终需要保持最新状态的网页.我不希望浏览器缓存它.为此,此元标记嵌入了页面:
<meta name="Expires" content="Tue, 01 Jun 1999 19:58:02 GMT">
Run Code Online (Sandbox Code Playgroud)
但是,有些浏览器似乎忽略了它.Chrome在这方面特别糟糕,尽管其他浏览器也倾向于做同样的事情.
当我从书签栏中选择页面时,大部分时间它甚至都没有命中服务器,只是从缓存中加载它.如果我然后按F5,它会转到服务器并获取新副本.
我错过了一些简单的事吗?我认为过期元标记是它的完成方式.
这发生在Windows 2000上的IIS 5.0上.
底线:看起来像HTML代码中的元标记几乎什么都不做.但是,在HTTP中设置expires标签可以很好地解决问题.
我正在尝试创建可以编辑的项目列表.像这样的东西:

为此,我在视图顶部添加了一个NavigationBar,然后在XCode设计器中添加了2个Bar Button项.我将左侧按钮的标识符设置为"添加",右侧的按钮设置为"编辑".
当我单击编辑时,我想将文本更改为完成.我尝试了各种方法,例如btnEdit.Title = "Done",但它根本不需要.
我看过几篇推荐.SetTitle的博客文章,但是UIButtonBarItem没有这种方法(至少在MonoTouch中).
那么,如何更改"编辑"按钮的标题?
c# ×4
.net-2.0 ×2
vb6 ×2
browser ×1
caching ×1
excel ×1
google-plus ×1
hardware ×1
interop ×1
ios ×1
ip-address ×1
lookup ×1
meta-tags ×1
performance ×1
photos ×1
picasa ×1
r ×1
search ×1
settings ×1
usb ×1
windows-7 ×1
windows-xp ×1
wmi ×1
xamarin.ios ×1