我正在使用c#.net windows表单应用程序。我有一个包含一些表格的数据库。我有两个组合框(A& B)。我使用sys.columns填充了一个包含表名列的组合框A.现在,当我在组合框A中选择一个项目时,组合框B应该填充相同的项目,但在组合框A中选择的项目除外。
答案 0 :(得分:1)
您应该删除此问题或this one这些相同的内容。无论如何,这是我的相同答案:
在选定的项目中更改A的事件,添加清除B的代码,然后循环回A的项目集合中的每个项目,并将其添加到B,只要当前项目的索引与SelectedItem的索引不同即可。甲
类似(伪代码,未测试)
b.Items.Clear;
for(int i=0; i<A.Items.Count; i++)
{
if (i!=A.SelectedItemIndex)
{
b.Items.Add(A.Items[i]);
}
}
或
B.Items.Clear;
foreach(object o in A.Items)
{
b.Items.Add(o);
}
b.Items.Remove(A.SelectedItem);
也应该这样做。
答案 1 :(得分:1)
我将使用静态扩展方法和LINQ的组合。
静态扩展部分如下所示:
// static class...
public static class ComboBoxHelper
{
public static string GetSelectedIndexText(this ComboBox target)
{
return target.Items[target.SelectedIndex].ToString();
}
public static object[] GetNonSelectedItems(this ComboBox target)
{
string selected = GetSelectedIndexText(target);
try
{
object[] result =
target.Items.Cast<object>().Where(c => c.ToString()
!= selected).ToArray();
return result;
}
catch
{
return new object[] { };
}
}
public static void ReplaceItems(this ComboBox target, object[] newRange)
{
target.Items.Clear();
target.Items.AddRange(newRange);
}
}
LINQ:
// LINQ:
private void ComboBoxA_SelectedIndexChanged(object sender, EventArgs e)
{
comboBoxB.ReplaceItems(comboBoxA.GetNonSelectedItems());
}
HTH!
注意:可能比返回列表项数组更有效,但我没有发现这是一个大问题(例如整体性能等).....
答案 2 :(得分:0)
我认为您必须在A的变更事件中填写/删除B
答案 3 :(得分:0)
m_comboB.Items.AddRange((from item in m_comboA.Items.Cast<object>()
where item != m_comboA.SelectedItem
select item).ToArray());
或者你可以使用这种不删除重复项目的方式(Sam在他的评论中指出了这一点):
m_comboB.Items.AddRange(Enumerable.Range(0, m_comboA.Items.Count)
.Where(index => index != m_comboA.SelectedIndex)
.Select(index => m_comboA.Items[index]).ToArray());