2013-07-09 2 views
0

미리 사과드립니다. 자신을 분명히하기가 어려울 수 있습니다. 나는 수색했지만, 그 토론은 내가 따라야 할 정도로 복잡했으며, 방금 C#에 머물기 시작했다.ListBox에 항목을 추가하고 다른 목록 상자의 항목에 바인딩합니다.

프로젝트 : C# WindowsForm/.NET 4.5/비주얼 스튜디오 2012

도전 : 내가 다른 목록 상자에 목록 상자에서 항목을 추가 할은 (나는 목록 및 foreach는 루프와 함께 쉽게 할 수 있습니다), 그리고 listbox2에서 선택한 항목에 따라 최종 목록 상자에 특정 항목을 표시합니다.

설명 : 선택한 항목은 내가에 ListBox1 항목의 소수를 선택하면, 내가 listbox3에게 보내도록 내가, 또 다른 목록 상자에서 만든 그룹을 통합 할 수 있지만 때 그들은 단지 나타납니다 목록 상자 2에서 특정 항목을 선택하십시오.

목록에서 게임을 선택하고 새 목록의 "Nintendo"그룹에 게임을 추가한다고 상상해보십시오. 목록 상자 2에서 Sega를 선택하면 Sega 게임과 섞이지 않을 것입니다.

나는 데이터 바인딩에 대해 읽은

선택 2.

의 선택을 존중하는 방법에 손실에서 나는 1에서 3으로 원하는 것들을 복사, 모든리스트 박스에 값을 추가 할 수 있지만 나는 그리고 예제는 너무 복잡했다. (아마도 약간의 언어 장벽이 존재했다.) 정말 작은 프로젝트에 가장 간단한 솔루션을 제공 할 수있는 리소스가 있는가?

평신도 용어를 사용하여 바보를 계몽하는 것이 중요합니까?

감사

편집 : 당신의 니스 (당신이 있었다 누구든지) 내 질문에 downvote합니다. 공정하다. 적어도 문제가 무엇인지, 또는 문제가 해결 될 수 있도록 질문에 답할 수 있습니다. 멋지지 않니? 나는 C#의 시동기이기 때문에 첫 번째 질문은 어리석은/게으른 것처럼 보일 수도 있습니다.

+0

귀하의 질문은 3 개의 목록 상자 모두가 원하는 특정 항목으로 지정되어있는 예제로 설명해야합니다. –

답변

1

데이터 바인딩을 사용하는 것이 좋습니다. 집중할 주요 구성 요소는 BindingSource입니다. 또한 filtering에 약간의 유연성을 줄 수 있으므로 기본 데이터에 대해 DataSets을 조사 할 수 있습니다. 그러나 이것이 작은 응용 프로그램이고 방금 배우는 경우 다음 예제는 좋은 시작일 수 있습니다.

각 목록 상자에 대해 BindingSource을 양식에 끌어 놓습니다. 그런 다음 각 ListBox의 DataSource 속성을 해당 BindingSource에 연결합니다. 여기

그 뒤에 예제 코드가 이미리스트 박스에 바인딩 차례에 어느 BindingSources 각각에 기본 데이터를 바인딩하는 방법을 보여줍니다 수 있습니다 :

namespace WindowsFormsApplication1 
{ 
    public class Game 
    { 
     public string Name { get; set; } 
     public string Group { get; set; } 
    } 

    public class Group 
    { 
     public string Description { get; set; } 
    } 

    public partial class Form1 : Form 
    { 
     List<Game> _allGames; 

     public Form1() 
     { 
      InitializeComponent(); 

      _allGames = new List<Game> 
      { 
       new Game { Name = "Alpha", Group = "" }, 
       new Game { Name = "Bravo", Group = "One" }, 
       new Game { Name = "Charlie" , Group = "One"}, 
       new Game { Name = "Delta", Group = "Two" } 
      }; 

      bindingSource1.DataSource = _allGames; 
      listBox1.DisplayMember = "Name"; 
      listBox1.ValueMember = "Name"; 

      var groups = new List<Group> 
      { 
       new Group { Description = "One" }, 
       new Group { Description = "Two" }, 
       new Group { Description = "Three" } 
      }; 

      bindingSource2.DataSource = groups; 
      listBox2.DisplayMember = "Description"; 
      listBox2.ValueMember = "Description"; 
     } 

     private void listBox2_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      var group = listBox2.SelectedValue.ToString(); 
      bindingSource3.DataSource = _allGames.Where(x => x.Group == group); 
      listBox3.DisplayMember = "Name"; 
     } 
    } 
} 

이 모든 코드는 데이터를 구속력하고있다 BindingSource 및 표시 할 기본 데이터의 속성을 각 ListBox에 알립니다. 이 예제에서는 listBox1의 각 항목을 listBox2의 그룹에 할당하는 메커니즘을 무시합니다. 그 작업을 수행하는 방법을 알고 있거나 이해할 수 있다고 가정하기 때문입니다.

listBox2가 변경된 이벤트 핸들러는 선택한 항목을 가져오고 listBox1에서 해당 항목과 일치하는 항목 목록을 만든 다음 listBox3에 해당 항목을 표시합니다.

+0

아직 배울 점이 많습니다 ... 쉽지는 않을 것이라는 것을 알고 있었지만,이 코드를 완전히 이해할 수는 없습니다. 더 많이 망쳐야 해. –

0

사전의 첫 번째 ListBox에있는 요소를 저장할 수 있으며 값은 두 번째 ListBox.

1

간단히하기 위해 목록 상자에 바인딩 된 항목을 문자열로 가정합니다. 그럼 당신은 (당신이 어딘가에 그것을 유지해야) 그룹 할당을 유지하기 위해 사전을 사용할 수 있습니다 키는 그룹의 이름, 문자열의 목록입니다

Dictionary<string, List<string>> listOfGroups = new Dictionary<string, List<string>>(); 

그룹의 항목을 보유하고 있습니다. 그런 다음, 어딘가에, 당신은 당신이 그런 값

void CreateGroup(string groupName) 
{ 
    listBox2.Items.Add(groupName); 
    if (!listOfGroups.ContainsKey(groupName) 
       listOfGroups.Add(groupName, new List<string>()); 
} 

를 할당됩니다있는 그룹을 만들고, 당신이 그들을 제거/그룹 항목을 관리하고 추가 할 때, 예를 들어, listBox2 변경에 선택 :

string item = (string)listBox1.SelectedItem; 

if(!listOfGroups.ContainsKey((string)listBox2.SelectedItem)) 
    listOfGroups.Add((string)listBox2.SelectedItem,new List<string>()); 
((List<string>)listOfGroups[(string)listBox2.SelectedItem]).Add(item); 

listBox3.Items.Add(item); 
listBox1.Items.Remove(item); 

그리고 마침내 :

하지만, 단지 생각
private void listBox2_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    listBox3.Items.Clear(); 
    if (!listOfGroups.ContainsKey((string)listBox2.SelectedItem)) 
     listOfGroups.Add((string)listBox2.SelectedItem, new List<string>()); 

    listBox3.Items.AddRange(listOfGroups[(string)listBox2.SelectedItem].ToArray()); 

    List<string> list = listOfAllItems.Where(a => !listBox3.Items.Contains(a)).ToList(); 
    listBox1.Items.Clear(); 
    listBox1.Items.AddRange(list.ToArray()); 
} 

. DataSet을 사용하고 있다면 linq (사전 대신)를 사용하여 listbox2가 변경된 후에 표시 할 항목을 선택할 수 있습니다.

+1

여기에도 많은 지식이 있으며, 나는 내 문제에 대한 가장 유효한 해결책을 인정할 자격이 없습니다. (다른보다 간단한 방법에 의지해야만했습니다.) 나는 잠시 후 지금으로 돌아가서 나의 질문에 가장 적합한 답을 선호 대답으로 표시 할 것입니다. –

관련 문제