0

以下は私が取り組んでいるコードです。私のアカウントは Dictionary(Of String, Integer) に保存されているので、値を簡単に関連付けることができます。私のリストビューは、仮想モードに変換した後はうまく機能していますが、リストビューに入力するだけで検索する機能が失われました。これがないと、名前で検索できない限り、機能全体が実質的に役に立たなくなります。複数の例を検索して実装しましたが、何も機能しません。私は何を間違っていますか?どのように見えるべきですか?

これにより、リストビューが作成されます。

Private Sub lstAccounts_RetrieveVirtualItem(sender As Object, e As RetrieveVirtualItemEventArgs) Handles lstAccounts.RetrieveVirtualItem
    lstAccounts.VirtualListSize = MainForm.accounts.Count 'Update after a dictionary edit.

    Dim i As New ListViewItem(MainForm.accounts.Keys(e.ItemIndex))
    If MainForm.accounts.ContainsKey(MainForm.accounts.Keys(e.ItemIndex).ToString) Then
        i.SubItems.Add(MainForm.accounts.Item(i.Text))
    End If
    e.Item = i
End Sub

これはMSDNからのものです。おそらく検索に必要ですが、私が見つけた唯一の例..

Private Sub lstAccounts_SearchForVirtualItem(sender As Object, e As SearchForVirtualItemEventArgs) Handles lstAccounts.SearchForVirtualItem
    Dim x As Double = 0
    If [Double].TryParse(e.Text, x) Then 'check if this is a valid search
        x = Math.Sqrt(x)
        x = Math.Round(x)
        e.Index = Fix(x)
    End If
End Sub

これもMSDNから。何を検索しても、常に null が返されます。

Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    Dim item1 As ListViewItem = lstAccounts.FindItemWithText(TextBox1.Text)
    If (item1 IsNot Nothing) Then
        MessageBox.Show("Calling FindItemWithText passing" & TextBox1.Text & ": " _
            & item1.ToString())
    Else
        MessageBox.Show("Calling FindItemWithText passing" & TextBox1.Text & ": null")
    End If
End Sub
4

1 に答える 1

1

イベントのハンドラーで、SearchForVirtualItem辞書を検索し、ListView入力されたものと一致した行のインデックスを通知する必要があります。

テキストを検索すると仮定すると、次のようなものが必要です。

foreach (var x in MainForm.accounts) {
    if (x.Value == e.Text) {
        e.Index = x.Key;
        return;
    }
}

ところで、仮想リストのサイズを別の場所で更新することをお勧めします。RetrieveVirtualItem イベントのハンドラーは、リストのサイズを変更する適切な場所ではありません。

于 2014-11-27T02:13:43.230 に答える