GUI를

2009-06-30 11 views
0

를 통해 사전에서 항목을 선택 나는이 상황이 :GUI를

Dictionary<Int32, userInfo> users = new Dictionary<Int32, userInfo>(); 

INT32는 사용자 ID이며, 사용자 정보는 이름과 기타 세부 사항이 포함되어 있습니다. 양식에 이름 목록을 표시하고 프로그램을 사용하는 사람이 MSN 메신저에서와 비슷한 창을 열려면 두 번 클릭 할 수 있습니다. 사용자의 이름을 두 번 클릭하면 내가 ID를 알아야, 그래서 나는

OpenChatWindow(Int32 id, string name); 

정말, 내가 윈폼을 사용하고 그것을 할 방법을 잘 모르겠습니다 할 수 있습니다. 나는 ListBox를 생각했지만, 다시, 나는 어떻게 확신 할 수 없다. 나는 어떻게해야합니까?

추신. userInfo.name은 사전에서 고유하지만 실제로 찾고 싶지 않습니다.

답변

6

사전 정보 개체에 사용자 정보를 저장하지 않기로했습니다. User라는 클래스를 만들고 클래스에 id를 포함하여 모든 정보를 저장합니다.

오버라이드 "로 .toString()"사용자 클래스의 방법과 사용자의 이름 대신 그럼 당신이 직접 목록 상자에 사용자 개체를 추가 할 수 있습니다

protected override string ToString() 
{ 
    return this.Name; 
} 

즉 그것은 출력 할 그들이 가 추가되면 사용자의 이름이 표시됩니다. 그들이 자동으로 캐스팅된다면 나는 그것을 100 %가 아닌 Object로 캐스팅해야 할 것입니다 ... 나는 그것에 대해 다시 알게 될 것입니다! 목록 상자의의 SelectedIndexChanged 이벤트에 다음

, 당신은 간단하게 수행 할 수 있습니다 그래서 만약 당신이

OpenChatWindow(user.ID, user.Name); 

: 당신이 당신의 조회에 사용하는 사용자 개체를 반환합니다

var user = myListBox.SelectedItem as User; 

컨트롤러 클래스를 ListBox의 SelectedIndexChanged 이벤트에 연결 한 다음 원하는 작업을 처리 할 수 ​​있습니다.

public void OnUserSelected(object sender, EventArgs e) 
{ 
     var lstBox = sender as ListBox; 
     if (lstBox != null) 
     { 
      if (lstBox.SelectedItem is User) 
      { 
       var user = lstBox.SelectedItem as User; 
       OpenChatWindow(user.ID, user.Name); 
      } 
     } 
} 
+1

목록 상자에 추가 할 때 객체로 사용자를 캐스팅 할 필요가 없습니다, .NET에서 암시 적 다운 캐스팅은 .NET에서 항상 허용됩니다. –

+0

나는 약 99 %의 패트릭이 그것을 정리해 주셔서 감사합니다! 당신이 AddRange 메서드를 사용한다면 당신은 캐스트를해야한다고 확신합니다. – James

+0

OP는 C# 3.0을 지정하지 않았으므로 "User user = myListBox.SelectedItem as User;"라고 선언해야 할 수도 있습니다. –

2

이 방법으로 userInfo 클래스를 변경하면 userId가 포함됩니다 (지금 필요없는 경우). 그런 다음 목록 상자에 사전 데이터 바인딩 할 수 있습니다

listBox.DisplayMember = "Name"; 
listBox.ValueMember = "userId"; 
listBox.DataSource = new List<UserInfoClass>(users.Values); 

그럼 당신은 단순히 캐스트 얻을 수의 selectedItem 속성을 사용자의 사용자 정보 클래스 :

UserInfoClass userInfo = (UserInfoClass)listBox.SelectedItem; 
OpenChatWindow(userInfo.userId, userInfo.Name); 
+0

이 구문은 무엇입니까? 그것은 문자열로 회원을 감지 할 수 있습니까 ?? – Nefzen

+0

사용자 사전을 변경하면 listBox가 변경되지 않습니다. 그게 좋지 않아. \ – Nefzen

+0

이 구문 목록 상자를 사용하면 자동으로 값을 추출하므로 msdn에서 더 자세히 읽으십시오. 사전에 따라, 당신은 빠른 조회가 필요하지 않다면, 다음 List 사전을 대체하고 listBox에 직접 바인딩 할 수 있습니다. – arbiter