2017-05-12 1 views
-2

LINQ 쿼리의 요소와 두 개의 콤보 상자가있는 목록이 있습니다. 첫 번째 콤보 상자는 데이터 소스로 목록을 사용하지만 두 번째 콤보 상자는 첫 번째 콤보 상자에서 선택한 항목없이 같은 목록을 사용하기를 원합니다. IE : 나 목록을 <> A, B, C
콤보 상자 옵션 A는, B, C
콤보 상자 선택된 항목하십시오
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을 위를 필요로하지 않는다); 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 
    { 
    } 
} 

편집 : 포함 영업 이익으로 윈폼의 버전은 윈폼

.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

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

is not working. 첫 번째 콤보 박스를 하나의 아이템으로 막아 버릴 수 없다. –

관련 문제