我写了一个程序在ListView中对“所有Windows已安装的软件”进行排序,我使用下面的代码来获取所有已安装软件的列表。
string uninstallKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(uninstallKey))
{
foreach (string skName in rk.GetSubKeyNames())
{
using (RegistryKey sk = rk.OpenSubKey(skName))
{
try
{
string[] row = { sk.GetValue("DisplayName").ToString()};
var listViewItem = new ListViewItem(row);
lstDisplayHardware.Items.Add(listViewItem);
}
catch (Exception ex)
{ }
}
}
label1.Text += " (" + lstDisplayHardware.Items.Count.ToString() + ")";
}
注意:此代码向我展示了所有已安装的程序,大约有145种情况。
之后,我决定在其名称附近对程序大小进行排序,因此更改了第6行,如下所示:
string[] row = { sk.GetValue("DisplayName").ToString() , sk.GetValue("EstimatedSize").ToString() };
现在的问题是,有94例案件的新结果计数。当我使用此新代码时,我的程序仅显示同时具有
DisplayName & EstimatedSize
的结果,但是由于某些程序没有EstimatedSize
属性,因此它们从结果中省略了,结果的数量从145减少到96。我该怎么办? 最佳答案
GetValue
状态的文档
如果名称/值对在注册表中不存在,则返回null
因此,您应该首先检查null。
var displayName = sk.GetValue("DisplayName");
var size = sk.GetValue("EstimatedSize");
ListViewItem item;
if(displayName != null)
{
if(size != null)
item = new ListViewItem(new string [] {displayName.ToString(),
size.ToString()});
else
item = new ListViewItem(new string [] {displayName.ToString()});
lstDisplayHardware.Items.Add(item);
}
如果您需要检查多个属性..根据您的评论,我建议类似的东西
var stringsToCheck = new string [] { "DisplayName", "SomethingElse",
"AndSomethingElse" };
List<string> items = new List<string>();
foreach(var s in stringsToCheck)
{
var val = sk.GetValue(s);
if(val != null)
items.Add(val.ToString());
}
var listViewItem = new ListViewItem(items.ToArray());
注意:可能不需要
ToArray
。