方法: ListView コントロールに検索機能を追加するHow to: Add Search Capabilities to a ListView Control

多くの場合、コントロール内の項目の大きいリストを操作するときは、 ListView ユーザーに検索機能を提供する必要があります。Oftentimes when working with a large list of items in a ListView control, you want to offer search capabilities to the user. コントロールは、 ListView テキスト一致と位置検索という2つの異なる方法でこの機能を提供します。The ListView control offers this capability in two different ways: text matching and location searching.

メソッドを使用すると、 FindItemWithText ListView 検索文字列およびオプションの開始インデックスと終了インデックスを指定して、リストまたは詳細ビューでテキスト検索を実行できます。The FindItemWithText method allows you to perform a text search on a ListView in list or details view, given a search string and an optional starting and ending index. これに対し、メソッドを使用すると、 FindNearestItem ListView x 座標と y 座標のセットと検索の方向を指定して、アイコンまたはタイルビュー内の項目を検索できます。In contrast, the FindNearestItem method allows you to find an item in a ListView in icon or tile view, given a set of x- and y-coordinates and a direction to search.

テキストを使用して項目を検索するにはTo find an item using text

  1. プロパティを ListView View またはに設定してを作成 Details List し、に ListView 項目を設定します。Create a ListView with the View property set to Details or List, and then populate the ListView with items.

  2. FindItemWithText検索する項目のテキストを渡して、メソッドを呼び出します。Call the FindItemWithText method, passing the text of the item you would like to find.

  3. 次のコード例では、基本的なを作成し、 ListView それに項目を設定し、ユーザーからのテキスト入力を使用してリスト内の項目を検索する方法を示します。The following code example demonstrates how to create a basic ListView, populate it with items, and use text input from the user to find an item in the list.

private:
    ListView^ textListView;
    TextBox^ searchBox;

private:
    void InitializeTextSearchListView()
    {
        textListView = gcnew ListView();
        searchBox = gcnew TextBox();
        searchBox->Location = Point(150, 20);
        textListView->Scrollable = true;
        textListView->Width = 100;

        // Set the View to list to use the FindItemWithText method.
        textListView->View = View::List;

        // Populate the ListViewWithItems
        textListView->Items->AddRange(gcnew array<ListViewItem^>{
            gcnew ListViewItem("Amy Alberts"),
            gcnew ListViewItem("Amy Recker"),
            gcnew ListViewItem("Erin Hagens"),
            gcnew ListViewItem("Barry Johnson"),
            gcnew ListViewItem("Jay Hamlin"),
            gcnew ListViewItem("Brian Valentine"),
            gcnew ListViewItem("Brian Welker"),
            gcnew ListViewItem("Daniel Weisman") });

        // Handle the TextChanged to get the text for our search.
        searchBox->TextChanged += gcnew EventHandler(this, 
            &Form1::searchBox_TextChanged);

        // Add the controls to the form.
        this->Controls->Add(textListView);
        this->Controls->Add(searchBox);
    }

private:
    void searchBox_TextChanged(Object^ sender, EventArgs^ e)
    {
        // Call FindItemWithText with the contents of the textbox.
        ListViewItem^ foundItem =
            textListView->FindItemWithText(searchBox->Text, false, 0, true);
        if (foundItem != nullptr)
        {
            textListView->TopItem = foundItem;
        }
    }
private ListView textListView = new ListView();
private TextBox searchBox = new TextBox();
private void InitializeTextSearchListView()
{
    searchBox.Location = new Point(10, 60);
    textListView.Scrollable = true;
    textListView.Width = 80;
    textListView.Height = 50;

    // Set the View to list to use the FindItemWithText method.
    textListView.View = View.List;

    // Populate the ListViewWithItems
    textListView.Items.AddRange(new ListViewItem[]{
        new ListViewItem("Amy Alberts"),
        new ListViewItem("Amy Recker"),
        new ListViewItem("Erin Hagens"),
        new ListViewItem("Barry Johnson"),
        new ListViewItem("Jay Hamlin"),
        new ListViewItem("Brian Valentine"),
        new ListViewItem("Brian Welker"),
        new ListViewItem("Daniel Weisman") });

    // Handle the TextChanged to get the text for our search.
    searchBox.TextChanged += new EventHandler(searchBox_TextChanged);

    // Add the controls to the form.
    this.Controls.Add(textListView);
    this.Controls.Add(searchBox);
}

private void searchBox_TextChanged(object sender, EventArgs e)
{
    // Call FindItemWithText with the contents of the textbox.
    ListViewItem foundItem =
        textListView.FindItemWithText(searchBox.Text, false, 0, true);
    if (foundItem != null)
    {
        textListView.TopItem = foundItem;
    }
}
Private textListView As New ListView()
Private WithEvents searchBox As New TextBox()

Private Sub InitializeTextSearchListView() 
    searchBox.Location = New Point(150, 20)
    textListView.Scrollable = True
    textListView.Width = 80
    textListView.Height = 50
    
    ' Set the View to list to use the FindItemWithText method.
    textListView.View = View.List
    
    ' Populate the ListView with items.
    textListView.Items.AddRange(New ListViewItem() { _
        New ListViewItem("Amy Alberts"), _
        New ListViewItem("Amy Recker"), _
        New ListViewItem("Erin Hagens"), _
        New ListViewItem("Barry Johnson"), _
        New ListViewItem("Jay Hamlin"), _
        New ListViewItem("Brian Valentine"), _
        New ListViewItem("Brian Welker"), _
        New ListViewItem("Daniel Weisman")})

    ' Add the controls to the form.
    Me.Controls.Add(textListView)
    Me.Controls.Add(searchBox)

End Sub
 
Private Sub searchBox_TextChanged(ByVal sender As Object, ByVal e As EventArgs) _
    Handles searchBox.TextChanged

    ' Call FindItemWithText with the contents of the textbox.
    Dim foundItem As ListViewItem = _
        textListView.FindItemWithText(searchBox.Text, False, 0, True)

    If (foundItem IsNot Nothing) Then
        textListView.TopItem = foundItem
    End If

End Sub

X 座標と y 座標を使用して項目を検索するにはTo find an item using x- and y-coordinates

  1. プロパティを ListView View またはに設定してを作成 SmallIcon LargeIcon し、に ListView 項目を設定します。Create a ListView with the View property set to SmallIcon or LargeIcon, and then populate the ListView with items.

  2. FindNearestItem必要な x 座標と y 座標、および検索する方向を渡して、メソッドを呼び出します。Call the FindNearestItem method, passing the desired x- and y-coordinates and the direction you would like to search.

  3. 次のコード例では、基本的なアイコンを作成し ListView 、それに項目を設定し、イベントをキャプチャして MouseDown 最も近い項目を上方向に検索する方法を示します。The following code example demonstrates how to create a basic icon ListView, populate it with items, and capture the MouseDown event to find the nearest item in the up direction.

    ListView^ iconListView;
    TextBox^ previousItemBox;

private:
    void InitializeLocationSearchListView()
    {
        previousItemBox = gcnew TextBox();
        iconListView = gcnew ListView();
        previousItemBox->Location = Point(150, 20);

        // Create an image list for the icon ListView.
        iconListView->SmallImageList = gcnew ImageList();

        // Add an image to the ListView small icon list.
        iconListView->SmallImageList->Images->Add(
            gcnew Bitmap(Control::typeid, "Edit.bmp"));

        // Set the view to small icon and add some items with the image
        // in the image list.
        iconListView->View = View::SmallIcon;
        iconListView->Items->AddRange(gcnew array<ListViewItem^>{
            gcnew ListViewItem("Amy Alberts", 0),
            gcnew ListViewItem("Amy Recker", 0),
            gcnew ListViewItem("Erin Hagens", 0),
            gcnew ListViewItem("Barry Johnson", 0),
            gcnew ListViewItem("Jay Hamlin", 0),
            gcnew ListViewItem("Brian Valentine", 0),
            gcnew ListViewItem("Brian Welker", 0),
            gcnew ListViewItem("Daniel Weisman", 0) });
         this->Controls->Add(iconListView);
         this->Controls->Add(previousItemBox);

         // Handle the MouseDown event to capture user input.
         iconListView->MouseDown += gcnew MouseEventHandler(
             this, &Form1::iconListView_MouseDown);
    }

    void iconListView_MouseDown(Object^ sender, MouseEventArgs^ e)
    {
        // Find the next item up from where the user clicked.
        ListViewItem^ foundItem = iconListView->FindNearestItem(
            SearchDirectionHint::Up, e->X, e->Y);

        // Display the results in a textbox..
        if (foundItem != nullptr)
        {
            previousItemBox->Text = foundItem->Text;
        }
        else
        {
            previousItemBox->Text = "No item found";
        }
    }
ListView iconListView = new ListView();
TextBox previousItemBox = new TextBox();

private void InitializeLocationSearchListView()
{
    previousItemBox.Location = new Point(150, 20);

    // Create an image list for the icon ListView.
    iconListView.LargeImageList = new ImageList();
    iconListView.Height = 400;

    // Add an image to the ListView large icon list.
    iconListView.LargeImageList.Images.Add(
        new Bitmap(typeof(Control), "Edit.bmp"));

    // Set the view to large icon and add some items with the image
    // in the image list.
    iconListView.View = View.LargeIcon;
    iconListView.Items.AddRange(new ListViewItem[]{
        new ListViewItem("Amy Alberts", 0),
        new ListViewItem("Amy Recker", 0),
        new ListViewItem("Erin Hagens", 0),
        new ListViewItem("Barry Johnson", 0),
        new ListViewItem("Jay Hamlin", 0),
        new ListViewItem("Brian Valentine", 0),
        new ListViewItem("Brian Welker", 0),
        new ListViewItem("Daniel Weisman", 0) });
    this.Controls.Add(iconListView);
    this.Controls.Add(previousItemBox);

    // Handle the MouseDown event to capture user input.
   iconListView.MouseDown +=
       new MouseEventHandler(iconListView_MouseDown);
    //iconListView.MouseWheel += new MouseEventHandler(iconListView_MouseWheel);
}

void iconListView_MouseDown(object sender, MouseEventArgs e)
{

    // Find the an item above where the user clicked.
    ListViewItem foundItem =
        iconListView.FindNearestItem(SearchDirectionHint.Up, e.X, e.Y);

    // Display the results in a textbox..
    if (foundItem != null)
        previousItemBox.Text = foundItem.Text;
    else
        previousItemBox.Text = "No item found";
}
Private WithEvents iconListView As New ListView()
Private previousItemBox As New TextBox()


Private Sub InitializeLocationSearchListView()
    previousItemBox.Location = New Point(150, 20)

    ' Create an image list for the icon ListView.
    iconListView.LargeImageList = New ImageList()

    ' Add an image to the ListView large icon list.
    iconListView.LargeImageList.Images.Add(New Bitmap(GetType(Control), "Edit.bmp"))

    ' Set the view to large icon and add some items with the image
    ' in the image list.
    iconListView.View = View.SmallIcon
    iconListView.Items.AddRange(New ListViewItem() { _
        New ListViewItem("Amy Alberts", 0), _
        New ListViewItem("Amy Recker", 0), _
        New ListViewItem("Erin Hagens", 0), _
        New ListViewItem("Barry Johnson", 0), _
        New ListViewItem("Jay Hamlin", 0), _
        New ListViewItem("Brian Valentine", 0), _
        New ListViewItem("Brian Welker", 0), _
        New ListViewItem("Daniel Weisman", 0)})

    Me.Controls.Add(iconListView)
    Me.Controls.Add(previousItemBox)
End Sub

Sub iconListView_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) _
    Handles iconListView.MouseDown

    ' Find the next item up from where the user clicked.
    Dim foundItem As ListViewItem = _
    iconListView.FindNearestItem(SearchDirectionHint.Up, e.X, e.Y)

    ' Display the results in a textbox.
    If (foundItem IsNot Nothing) Then
        previousItemBox.Text = foundItem.Text
    Else
        previousItemBox.Text = "No item found"
    End If


End Sub

関連項目See also