2013-07-09 367 views
0

我很抱歉,我可能很難說清楚。我已經搜索過了,但對於我來說討論要複雜得多,而我剛開始住在C#中。將項目添加到列表框並將它們綁定到另一個列表框中的項目

項目:C#WindowsForm/.NET 4.5 /的Visual Studio 2012

挑戰: 我想從一個列表框添加項目到另一個列表框(我可以用列表和foreach循環很容易做到這一點),和根據listbox2中的選擇使結束列表框顯示特定的項目。

說明: 選中的項目納入,我在另一個列表框創建,因此,如果我選擇在ListBox1的項目屈指可數,我送他們到listbox3一組,但他們只應該當我出現在列表框2中選擇一個特定的項目。

想象一下,從列表中選擇遊戲,將其添加到「Nintendo」組中,以便在列表框2中選擇世嘉時,它們不會與世嘉組合混合。

我可以在所有的列表框就如何作出選擇尊重。2.

選擇虧損增加值,複製我想從1到3的,但我是我讀過有關數據綁定但是這些例子太複雜了(也許存在一些語言障礙),是否有一種資源可以爲一個非常小的項目提供最簡單的解決方案?

請注意使用外行條款來啓迪傻瓜嗎?

感謝

編輯: 尼斯你(你是誰),以downvote我的問題。很公平。您至少可以告訴我問題是什麼,或者問題的答案在哪裏,以便我可以解決我的問題。這不是很好嗎?我是C#的入門者,所以第一個問題看起來很荒唐/懶惰是很自然的......

+0

你的問題應該用一個例子來描述,在這個例子中,所有3個列表框都是用你希望它們的某些項目指定的。 –

回答

1

DataBinding將是要走的路。重點關注的主要部分是BindingSource。您也可以調查DataSets作爲您的基礎數據,因爲它們可以爲您提供一些靈活性filtering。但是,如果這是一個小應用程序,並且您剛剛學習,則下面的示例可能是一個好開始:

將每個列表框的BindingSource拖到您的表單上。然後,將每個列表框的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

您可以保存某種字典,key是第一個ListBox中的元素,value是第二個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); 

而且finaly:

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

再次,這裏有很多知識,而且我沒有資格認識到對我的問題最有效的解決方案(我不得不求助於其他更簡單的方法)。我將從現在開始回到這一點,並將最適合我的問題的答案標記爲首選答案。 –

相關問題