2009-05-19 9 views
2

사전에서 ListBox로 키/값 쌍을 표시하려고합니다.ListBox에서 사전을 표시하는 방법

Key Value 
A 10 
B 20 
C 30 

는 내가 사전에 Listbox.Datasource를 링크 할 수 있었다 다음 코드를 사용하여 형식을

A(10) 
B(20) 
C(30) 

다음의 목록 상자에서 그들을 표시 할. 나는 그것이 내가 원하는 방식으로 표시되도록 포맷하는 방법을 알아낼 수 없습니다

[A, 10] 
[B, 20] 
[C, 30] 

myListBox.DataSource = new BindingSource(myDictionary, null); 

그 표시된다.

도움이 될 것입니다.

감사 인 Ashish

+0

당신은 언어를 나타내는이 질문에 태그를 추가 할 수 있습니다을 그 너는 사용하고있어. 또한 코드를 선택하고 ctrl-k을 눌러 포맷 할 수 있습니다. Stackoverflow에 오신 것을 환영합니다. – Stephan202

답변

6

사용 목록 상자에서 형식의 이벤트를 호출하는 것을 잊지 마세요 :

KeyValuePair<string, int> item = (KeyValuePair<string, int>)e.ListItem; 
e.Value = string.Format("{0}({1})", item.Key, item.Value); 
+0

감사합니다 !! 그것은 아름답게 일했다! – Ashish

0

당신은 사전 객체를 반복하고 가서 목록 상자 항목을 만들 수있다. 적절한 장기 flexiblitity를 들어

foreach (KeyValuePair<string, int> kvp in myDictionary) 
    { 
     lbx.Items.Add(String.Format("{0}({1})", kvp.Key, kvp.Value.ToString())); 
    } 
+0

그런 다음 문자열 값을 구문 분석하여 키 또는 값을 다른 곳에서 따로 검색해야합니다. 또한 데이터 바인딩이 느슨합니다. – CoderDennis

5

내가, 당신은 당신이, 고유 키를 사용해야합니다, 값을 변경하지 아니, 이벤트를 발생에서 실제 개체를 얻을 수 나중에 좋아 지금까지 무엇을 할 수 시도하고 형식화 된 개체를 사용하는 것 오히려 당신이 목록 상자를 사용자 지정하려는 경우

public partial class tester : Form 
{ 
    public tester() 
    { 
     InitializeComponent(); 
     List<MyObject> myObjects = new List<MyObject>(); 
     MyObject testObject = new MyObject("A", "10"); 
     myObjects.Add(testObject); 
     BindingSource bindingSource = new BindingSource(myObjects,null); 
     listBox1.DisplayMember = "DisplayValue"; 
     listBox1.DataSource = bindingSource; 
    } 
} 

public class MyObject 
{ 
    private string _key; 
    private string _value; 

    public MyObject(string value, string key) 
    { 
     _value = value; 
     _key = key; 
    } 

    public string Key 
    { 
     get { return _key; } 
    } 

    public string Value 
    { 
     get { return _value; } 
    } 

    public string DisplayValue 
    { 
     get { return string.Format("{0} ({1})", _key, _value); } 
    } 
} 
+0

예,이 솔루션은 훨씬 우수한 솔루션이며 IMO에 대한 답변으로 표시되어야합니다. – Andy

0

사실은 단지 형식의 캐릭터에 비해 목록 상자는 그것에서 파생 오버라이드 (override)

protected override OnDrawItem

답변 1은 질문에 언급 한 내용을 가져 오지만, 객체의 변경 사항을 반영하려면 그리기 루틴을 작성하면 자동으로 반영됩니다.

또는 트릭을 수행 할 항목의 텍스트를 변경할 수 있습니다.

을 위해 BeginUpdate()와와 EndUpdate()

+0

사용자 지정 목록 상자를 파생 할 필요가 없습니다. DrawItem 이벤트 만 처리하면됩니다. – CoderDennis

관련 문제