2017-05-12 158 views
-2

我有一個LINQ查詢元素列表和兩個組合框。我希望第一個組合框使用列表作爲數據源,但第二個組合框使用同一個列表,而不使用第一個選擇的項目。 IE:我列表<>:A,B,C
Combobox1選擇:A,B,C
Combobox1選擇的項目:甲
Combobox2選項:B,C
基於組合框選擇從列表中減去項目

下面是代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class AdicionarEquipa_Admin: Form 
    { 
     private DiagramaEntidadesContainer dbATMT; 

     public AdicionarEquipa_Admin() 
     { 
      InitializeComponent(); 
      dbATMT = new DiagramaEntidadesContainer(); 

      PreencherListas(); 

     } 

     private void PreencherListas() 
     { 
      List<Player> jogadores = (from player in dbATMT.PlayerSet 
             select player).ToList<Player>(); 

      Player jogadorSelecionado = (Player)cB_addEquipaJogador1.SelectedItem; 

      List<Player> jogadores2 = new List<Player>(); 

      foreach (Player jogador in jogadores) 
      { 
       if (jogador != jogadorSelecionado) 
       { 
        jogadores2.Add(jogador); 
       } 
      } 

      cB_addEquipaJogador1.DataSource = jogadores; 
      cB_addEquipaJogador2.DataSource = jogadores2; 
     } 

     private void cB_addEquipaJogador1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      PreencherListas(); 

     } 

     private void cB_addEquipaJogador2_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      PreencherListas(); 
     } 
    } 
} 

這是行不通的。 DiagramaEntidadesContainer是一個ado.net數據庫。

+2

的'''名單 .Remove'''函數返回一個布爾值 – fshauge

+0

所以我應該做的「jogadores.Remove(jogadorSelecionado ); jogadores2 = jogadores;' ? –

+0

您必須將第一個列表的內容複製到列表的新實例中,但不包括選定的元素(jogadorSelecionado) – fshauge

回答

1
  • 我已經做了什麼,我認爲你正在嘗試做一個例子。

的.xaml

<ComboBox x:Name="cB_addEquipaJogador1" HorizontalAlignment="Left" Margin="120,55,0,0" VerticalAlignment="Top" Width="120" Loaded="ComboBox_Loaded" 
     SelectionChanged="ComboBox_SelectionChanged"/> 
<ComboBox x:Name="cB_addEquipaJogador2" HorizontalAlignment="Left" Margin="120,163,0,0" VerticalAlignment="Top" Width="120" /> 

.xaml.cs

using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfApp1 
{ 
    public partial class MainWindow : Window 
    { 
     List<Player> jogadores = new List<Player>(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
      jogadores.Add(new Player()); 
      jogadores.Add(new Player()); 
     } 

     private void ComboBox_Loaded(object sender, RoutedEventArgs e) 
     { 
      cB_addEquipaJogador1.ItemsSource = jogadores; 
      cB_addEquipaJogador1.SelectedIndex = 0; 
     } 

     private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 
      Player jogadorSelecionado = cB_addEquipaJogador1.SelectedItem as Player; 

      List<Player> jogadores2 = new List<Player>(jogadores.Count); 

      jogadores.ForEach(item => 
      { 
       jogadores2.Add(item); 
      }); 

      jogadores2.Remove(jogadorSelecionado); 

      cB_addEquipaJogador2.ItemsSource = jogadores2; 
      cB_addEquipaJogador2.SelectedIndex = 0; 
     } 
    } 

    public class Player 
    { 
    } 
} 

編輯:包括版本的WinForms爲OP使用的WinForms

了.Designer.cs

this.cB_addEquipaJogador1.SelectedIndexChanged += new System.EventHandler(this.cB_addEquipaJogador1_SelectedIndexChanged); 

cB_addEquipaJogador2 不需要高於

的.cs

using System.Collections.Generic; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class AdicionarEquipa_Admin : Form 
    { 
     private DiagramaEntidadesContainer dbATMT; 

     public AdicionarEquipa_Admin() 
     { 
      InitializeComponent(); 
      dbATMT = new DiagramaEntidadesContainer(); 

      //Needs improvement :/ 
      cB_addEquipaJogador1.DataSource = (from player in dbATMT.PlayerSet select player).ToList<Player>(); 
      cB_addEquipaJogador1.SelectedIndex = 0; 
     } 

     private void PreencherListas() 
     { 
      //Needs improvement :/ 
      List<Player> jogadores = (from player in dbATMT.PlayerSet 
            select player).ToList<Player>(); 

      Player value = cB_addEquipaJogador1.SelectedItem as Player; 

      List<Player> jogadores2 = new List<Player>(jogadores.Count); 

      jogadores.ForEach(item => 
      { 
       jogadores2.Add(item); 
      }); 

      jogadores2.Remove(value); 

      cB_addEquipaJogador2.DataSource = jogadores2; 
      cB_addEquipaJogador2.SelectedIndex = 0; 
     } 

     private void cB_addEquipaJogador1_SelectedIndexChanged(object sender, System.EventArgs e) 
     { 
      PreencherListas(); 
     } 
    } 

    public class Player 
    { 
    } 
} 
+0

doenst工作.... –

+0

您將需要一個if語句來檢查刪除已成功。什麼是cB_addEquipaJogador1的類型? –

+0

comboBox。有兩個:cB_addEquipaJogador1和cB_addEquipaJogador2。 –

0

編輯:

由於名單是獨一無二的,你可以簡單地刪除該項目並使用它作爲數據源。

jogadores.Remove(jogadorSelecionado); 
... 
cB_addEquipaJogador2.DataSource = jogadores; 

您將有沒有選擇的值來創建列表的副本。這是可以做到這樣的:

private void PreencherListas() 
{ 
    List<Player> jogadores = (from player in dbATMT.PlayerSet 
           select player).ToList<Player>(); 

    Player jogadorSelecionado = (Player)cB_addEquipaJogador1.SelectedItem; 

    List<Player> jogadores2 = new List<Player>(); 

    foreach (var jogador in jogadores) 
    { 
     if (jogador != jogadorSelecionado) 
     { 
      jogadores2.Add(jogador); 
     } 
    } 

    cB_addEquipaJogador1.DataSource = jogadores; 
    cB_addEquipaJogador2.DataSource = jogadores2; 
} 
+0

您所說的「編輯」不工作。我使用我的InitializeComponent()函數;部分以及組合框的SelectedIndexChanged函數,當我選擇選項時它會混亂。或者讓它們相同,或者在一個選項中禁止,我不能改變它... –

+0

我的意思是說你不需要'''cB_addEquipaJogador1.DataSource = jogadores;'''如果組合框已經包含項目。如果不清楚,請嘗試其他選項。 – fshauge

+0

不工作。是阻止第一個組合框與一個項目,我不能改變它... –

相關問題