列表框添加了太多条目

时间:2014-06-11 15:46:10

标签: visual-studio-2013

我想要的是这个程序要在"安装"中显示Microsoft Outlook 2010。列表框是否已安装且未安装""如果没有安装。 " ListBox1中"在表单加载中包含所有已安装应用程序的列表。

问题在于它确实适用于"已安装的"部分,它在"未安装"中列出了应用程序多次。框。我只希望它出现一次。

Private Sub Form1_Load(sender as Object,e As EventArgs)处理MyBase.Load

    Dim regkey, subkey As Microsoft.Win32.RegistryKey
    Dim value As String
    Dim regpath As String = "Software\Microsoft\Windows\CurrentVersion\Uninstall"
    regkey = My.Computer.Registry.LocalMachine.OpenSubKey(regpath)
    Dim subkeys() As String = regkey.GetSubKeyNames
    Dim includes As Boolean
    For Each subk As String In subkeys
        subkey = regkey.OpenSubKey(subk)
        value = subkey.GetValue("DisplayName", "")
        If value <> "" Then
            includes = True
            If value.IndexOf("Hotfix") <> -1 Then includes = False
            If value.IndexOf("Security Update") <> -1 Then includes = False
            If value.IndexOf("Update for") <> -1 Then includes = False
            If includes = True Then ListBox1.Items.Add(value)
        End If
    Next

    Dim count As Integer = (ListBox1.Items.Count - 1)
    Dim words As String
    Dim softName As String


    softName = "Microsoft Outlook 2010"
    For a = 0 To count
        words = ListBox1.Items.Item(a)
        If InStr(words.ToLower, softName.ToLower) Then
            Installed.Items.Add(words)
        Else
            NotInstalled.Items.Add(softName)
        End If
    Next

2 个答案:

答案 0 :(得分:0)

重复字符串是由于为检查的每个项目调用NotInstalled.Items.Add(softName)而导致的简单错误。您可能只想在循环结束时添加它。

但是,您可以使用Linq

来简化代码
Dim result = words.Where(Function(x) x.ToLower().IndexOf("microsoft outlook 2010") >= 0)
if result IsNot Nothing then
    Installed.Items.AddRange(result.ToArray)
else
    NotInstalled.Items.Add(softName)
end if

但是你应该考虑代码中的一些问题。如果Outlook作为Office的一部分安装,则卸载部分中没有该条目。如果您在64位系统上运行,则存在自动重定向到注册表的不同部分的问题。如果您的Outlook是64位系统上安装的32位版本并且您的应用程序在AnyCPU模式下运行怎么办?考虑到所有这些可能性并不是一项微不足道的任务。只是为了警告你

答案 1 :(得分:0)

我认为你应该尝试类似的东西。 (我是一个c#家伙,所以我希望我的语法是正确的。)

Dim isOutlookInstalled = False

softName = "Microsoft Outlook 2010"
For a = 0 To count
    words = ListBox1.Items.Item(a)
    If InStr(words.ToLower, softName.ToLower) Then
        Installed.Items.Add(words)
    End If
Next
If isOutlookInstalled <> True
    NotInstalled.Items.Add(softName)
End If