다음을 통해 공유


방법: ListView 컨트롤에 검색 기능 추가

업데이트: 2007년 11월

ListView 컨트롤에서 대용량 항목 목록을 자주 사용하여 작업하는 경우 사용자에게 검색 기능을 제공할 수 있습니다. ListView 컨트롤은 텍스트 일치 방법과 위치 검색 방법으로 이 기능을 제공합니다.

검색 문자열과 선택적 시작 및 끝 인덱스가 제공될 경우 FindItemWithText 메서드를 사용하여 목록 또는 자세히 보기의 ListView에서 텍스트를 검색할 수 있습니다. 반대로 X 좌표, Y 좌표 및 검색 방향이 지정된 경우 FindNearestItem 메서드를 사용하여 아이콘 또는 Tile 보기의 ListView에서 항목을 찾을 수 있습니다.

텍스트를 사용하여 항목을 찾으려면

  1. View 속성을 Details 또는 List로 설정하여 ListView를 만든 다음 ListView에 항목을 채웁니다.

  2. FindItemWithText 메서드를 호출하여 찾을 항목의 텍스트를 전달합니다.

  3. 다음 코드 예제에서는 기본 ListView를 만들고 항목을 채운 다음 사용자가 입력한 텍스트를 사용하여 목록에서 항목을 찾는 방법을 보여 줍니다.

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
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:
    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;
        }
    }

X 좌표와 Y 좌표를 사용하여 항목을 찾으려면

  1. View 속성을 SmallIcon 또는 LargeIcon으로 설정하여 ListView를 만든 다음 ListView에 항목을 채웁니다.

  2. FindNearestItem 메서드를 호출하여 원하는 X 및 Y 좌표와 검색 방향을 전달합니다.

  3. 다음 코드 예제에서는 기본 아이콘 ListView를 만들고 항목을 채운 다음 MouseDown 이벤트를 캡처하여 위쪽 방향으로 가장 가까운 항목을 찾는 방법을 보여 줍니다.

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
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";
}
    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";
        }
    }

참고 항목

작업

방법: Windows Forms ListView 컨트롤을 사용하여 항목 추가 및 제거

참조

ListView 컨트롤 개요(Windows Forms)

ListView

FindItemWithText

FindNearestItem

기타 리소스

ListView 컨트롤(Windows Forms)