C# 根据组合框选择从列表中减去项
我有一个包含LINQ查询元素的列表和两个combobox。我希望第一个组合框使用列表作为数据源,但第二个组合框使用相同的列表,而没有在第一个组合框上选择项目。 例如:我有列表:A、B、CC# 根据组合框选择从列表中减去项,c#,list,linq,combobox,C#,List,Linq,Combobox,我有一个包含LINQ查询元素的列表和两个combobox。我希望第一个组合框使用列表作为数据源,但第二个组合框使用相同的列表,而没有在第一个组合框上选择项目。 例如:我有列表:A、B、C Combobox1选项:A、B、C Combobox1所选项目:A Combobox2选项:B、C 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin
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();
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
命名空间Windows窗体应用程序1
{
公共部分类设备管理员:表格
{
专用诊断容器dbATMT;
公共AdicionarEquipa_Admin()
{
初始化组件();
dbATMT=新的DiagramentIdaDesContainer();
前额肌();
}
私人无效预检表()
{
列出jogadores=(来自dbATMT.PlayerSet中的播放器
选择player.ToList();
玩家jogadorSelecionado=(玩家)cB_addEquipaJogador1.SelectedItem;
List jogadores2=新列表();
foreach(Jogadors中的运动员jogador)
{
如果(jogador!=jogador seleconado)
{
jogadores2.添加(jogador);
}
}
cB_addEquipaJogador1.DataSource=jogadores;
cB_addEquipaJogador2.DataSource=jogadores2;
}
私有无效cB_addEquipaJogador1_SelectedIndexChanged(对象发送方,事件参数e)
{
前额肌();
}
私有无效cB_addEquipaJogador2_SelectedIndexChanged(对象发送方,事件参数e)
{
前额肌();
}
}
}
这不管用。DiagramentDadesContainer是一个ado.net数据库。编辑:
由于列表是唯一的,您可以简单地删除该项并将其用作数据源
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;
}
private void PreencherListas()
{
列出jogadores=(来自dbATMT.PlayerSet中的播放器
选择player.ToList();
玩家jogadorSelecionado=(玩家)cB_addEquipaJogador1.SelectedItem;
List jogadores2=新列表();
foreach(Jogadors中的var jogador)
{
如果(jogador!=jogador seleconado)
{
jogadores2.添加(jogador);
}
}
cB_addEquipaJogador1.DataSource=jogadores;
cB_addEquipaJogador2.DataSource=jogadores2;
}
- 我已经举了一个例子,说明我认为你在努力做什么
使用System.Collections.Generic;
使用System.Windows.Forms;
命名空间Windows窗体应用程序1
{
公共部分类设备管理员:表格
{
专用诊断容器dbATMT;
公共AdicionarEquipa_Admin()
{
初始化组件();
dbATMT=新的DiagramentIdaDesContainer();
//需要改进:/
cB_addEquipaJogador1.DataSource=(来自dbATMT.PlayerSet select player中的player).ToList();
cB_addEquipaJogador1.SelectedIndex=0;
}
私人无效预检表()
{
//需要改进:/
列出jogadores=(来自dbATMT.PlayerSet中的播放器
选择player.ToList();
Player value=cB_addEquipaJogador1.选择editem作为Player;
List jogadores2=新列表(jogadores.Count);
jogadores.ForEach(项目=>
{
jogadores2.添加(项目);
});
jogadores2.移除(值);
cB_addEquipaJogador2.DataSource=jogadores2;
cB_addEquipaJogador2.SelectedIndex=0;
}
私有无效cB_addEquipaJogador1_SelectedIndexChanged(对象发送方,System.EventArgs e)
{
前额肌();
}
}
公开课选手
{
}
}
List.Remove函数返回一个布尔值,因此我应该执行'jogadores.Remove(jogadorSelecionado)';jogadores2=jogadores;'?您必须将第一个列表的内容复制到列表的新实例中,不包括您所说的“编辑”无效的选定元素(jogadorSelecionado)。我正在使用InitializeComponent()上的函数;在组合框的SelectedIndexChanged函数上单击和,当我选择on选项时,它会出错。或者使它们相同,或者在一个选项中阻塞,我无法更改它…我的意思是,您不需要cB_addEquipaJogador1.DataSource=jogadores代码>如果组合框已包含项目。如果不清楚,请尝试其他选项。当SelectedIndexChanged事件激发时,是否确实调用了PreencherListas()
函数?否,该项是索引项。SelectedIndexChanged。我能告诉您的只是插入断点并逐步检查代码以查看错误所在位置。您需要使用if语句来检查删除是否成功。cB_addEquipaJogador1是什么类型的?@NelsonSilva它对我有用:?但我认为您设置的错误,但我已将我的答案说得更清楚,对不起:/add this.cB_addEquipaJogador1.SelectedIndexChanged+=new System.EventHandler(this.cB_addEquipaJogador1\u SelectedIndexChanged);谢谢你取得了巨大的进步!在你的问题中,你只想要“我有列表:A,B,C Combobox1选项:A,B,C Combobox1选定项:A Combobox2选项:B,C”@NelsonSilva,但我会尝试更新我的answer@NelsonSilva:D
<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" />
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
{
}
}
this.cB_addEquipaJogador1.SelectedIndexChanged += new System.EventHandler(this.cB_addEquipaJogador1_SelectedIndexChanged);
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
{
}
}