개발자/C#

c# 콤보박스 자동완성 기능을 구현 - 리스트박스,텍스트박스에서도 동일한 원리

지구빵집 2012. 9. 26. 17:10
반응형



방법은 여러가지가 있을 수 있지만 아래와 같은 방법으로 구현. 


이것은 콤보박스뿐만 아니라 리스트 박스, 텍스트 박스에도 그대로 적용이 된다. 아래의 코드는 MSDN 샘플코드를 우선 옮겼고, 이코드를 그대로 속담 보여주는 프로그램에 적용하였고 아주 잘 작동된다.


컨트롤 - 리스트박스, 콤보박스, 텍스트박스 - 에 아래와 같은 프로퍼티에 대해 알아두고 시작한다.


ComboBox.AutoCompleteMode 멤버에는 

멤버 이름설명
Append가장 가능성 있는 후보 문자열의 나머지를 기존 문자에 추가하고 추가된 문자를 강조 표시합니다.
NoneComboBox 및 TextBox 컨트롤의 자동 완성 기능을 사용하지 않습니다.
Suggestedit 컨트롤과 연결된 보조 드롭다운 목록을 표시합니다. 이 드롭다운 목록은 제시된 하나 이상의 완성 문자열로 채워집니다.
SuggestAppendSuggest와 Append 옵션을 모두 적용합니다.


ComboBox.AutoCompleteSource 멤버에는 

멤버 이름설명
AllSystemSourcesFileSystem 및 AllUrl에 해당하는 것을 소스로 지정합니다. AutoCompleteMode가 기본값이 아닌 값으로 설정된 경우에 이것이 기본값입니다.
AllUrlHistoryList 및 RecentlyUsedList에 해당하는 것을 소스로 지정합니다.
CustomSource기본 AutoCompleteStringCollection의 문자열을 소스로 지정합니다.
FileSystem파일 시스템을 소스로 지정합니다.
FileSystemDirectories파일 이름은 제외하고 디렉터리만 자동으로 완성되도록 지정합니다.
HistoryList기록 목록에 있는 URL(Uniform Resource Locator)을 포함합니다.
ListItemsComboBox의 항목이 소스를 나타내도록 지정합니다.
None현재 사용되는 AutoCompleteSource가 없도록 지정합니다. 이것이 AutoCompleteSource의 기본값입니다.
RecentlyUsedList최근에 사용된 URL(Uniform Resource Locator) 목록의 URL을 포함합니다.


아래는 msdn 샘플코드~


여기서 구현하는 것은

  • 사용 하는 AutoCompleteSource 속성을 사용 하 여 TextBox 컨트롤의 자동 완성 동작을 사용자 지정 소스를 적용 합니다.

  • 사용 하는 AutoCompleteCustomSource 값의 사용자 지정 목록을 설정 하는 속성입니다.

  • 사용 하는 AutoCompleteMode 자동 완성 지원 자가 표시 되는 방법을 설정 하는 속성입니다.


    private void Form1_Load(object sender, EventArgs e)
    {
        // Create the list to use as the custom source. 
        var source = new AutoCompleteStringCollection();
        source.AddRange(new string[]
                        {
                            "January",
                            "February",
                            "March",
                            "April",
                            "May",
                            "June",
                            "July",
                            "August",
                            "September",
                            "October",
                            "November",
                            "December"
                        });
    
        // Create and initialize the text box.
        var textBox = new TextBox
                      {
                          AutoCompleteCustomSource = source,
                          AutoCompleteMode = 
                              AutoCompleteMode.SuggestAppend,
                          AutoCompleteSource =
                              AutoCompleteSource.CustomSource,
                          Location = new Point(20, 20),
                          Width = ClientRectangle.Width - 40,
                          Visible = true
                      };
    
        // Add the text box to the form.
        Controls.Add(textBox);
    }


그러니까 컨트롤의 AutoCompleteCustomSource,  AutoCompleteMode, AutoCompleteSource 요 세가지 속성을 잘 설정을 하면 되고 파일이나 어레이 리스트나 배열의 내용을 string[] (스트링 배열)로 변환하여 textbox.AutoCompleteCustomSource = source 로 설정해주면 구현이 된다.


내 경우엔 파일에서 불러온 속담들을 어레이 리스트에 순차적으로 관리한다. 짝수는 속담이고, 홀수는 풀이가 된다. 그것을 스트링 어레이로 바꿔서 AutoCompleteCustomSource 에 할당한것이다.


좀 비효율적이고 같은 데이타에 대해 두배의 메모리를 쓰게 된다. 좀 보완이 필요할듯~


역시 데이터를 어디에 담느냐에 따라 어떤 행동을 하게 되는지 결정된다. "매우중요"


위 내용이 구현된 코드를 보자 !



private void initComboboxSource()

{

var source = new AutoCompleteStringCollection();


string[] tempstring = new string[maxims.Count/2];

int j = 0;

for (int i = 0; i < maxims.Count; i++)

{

if ((i % 2) != 0)

{

tempstring[j] = maxims[i].ToString();

j++;

}

}

source.AddRange(tempstring);


comboBox1.AutoCompleteCustomSource = source;

comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;

comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;

}


source 라는 것을 collection 으로 쓰겠다고 알려주고,

Arraylist 인 maxims 라는 놈을 불러다가 속담만 담아준다. source.AddRange(tempstring);


그리고 맨 아래 세줄을 다시 설정하면 된다. 폼의 프로퍼티에서만 설정하면 잘 동작 안하는데 위 코드와 같이 3줄을 붙이니 잘 동작한다. 

단어 하나하나에 대해서도 동작하면 좋겠는데 그건 숙제로다가~ ㅎㅎ


도움이 되길바랍니다.  거침없이 혁신 ! 담배 한 대 피고....






반응형