根据组合框选择从列表中减去项目

时间:2017-05-12 14:09:45

标签: c# list linq combobox

我有一个列表,其中包含来自LINQ查询的元素和两个组合框。我希望第一个组合框使用列表作为数据源,但第二个组合框使用相同的列表,而不在第一个组合框中选择项目。 I.E。:我有清单<&gt ;:A,B,C
Combobox1选项:A,B,C
Combobox1选择项目:A
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数据库。

1 个答案:

答案 0 :(得分: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
    {
    }
}