2017-05-12 15 views
-2

LINQクエリの要素と2つのコンボボックスを持つリストがあります。最初のコンボボックスはデータソースとしてリストを使用しますが、2番目のコンボボックスは最初のコンボボックスで選択された項目を使わずに同じリストを使用します。 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

jogadorSelecionadoをABOVEを必要としません); 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 
    { 
    } 
} 

EDIT:含まれるOPとしてリサイズのためのバージョンは、リサイズ

.Designer.cs

を使用しています
this.cB_addEquipaJogador1.SelectedIndexChanged += new System.EventHandler(this.cB_addEquipaJogador1_SelectedIndexChanged); 

cB_addEquipaJogador2 ので、私がすべき "jogadores.Remove(

は.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 work .... –

+0

削除が成功したことを確認するには、ifステートメントが必要です。 cB_addEquipaJogador1のタイプは何ですか?コンボボックス –

+0

。 cB_addEquipaJogador1とcB_addEquipaJogador2の2つがあります。 –

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関数では、私はオプションを選択したときにそれを混乱させます。または、それらを同じものにするか、1つのオプションでブロックしても変更できません。 –

+0

私は、コンボボックスに既にアイテムが含まれている場合、 '' 'cB_addEquipaJogador1.DataSource = jogadores;' 'は必要ないということです。明確でない場合は、他のオプションを試してください。 – fshauge

+0

is not working。 1つ目のコンボボックスが1つの項目でブロックされていて、それを変更できません。 –

関連する問題