【发布时间】:2010-04-27 21:36:53
【问题描述】:
我正在使用 c# .net windows 窗体应用程序。我有一个包含一些表的数据库。我有两个组合框(A 和 B)。我使用 sys.columns 填充了一个组合框 A,其中包含表的列名。现在,当我在组合框 A 中选择一个项目时,组合框 B 应该填充相同的项目,除了在组合框 A 中选择的选定项目。
【问题讨论】:
-
问题是......?
标签: c#
我正在使用 c# .net windows 窗体应用程序。我有一个包含一些表的数据库。我有两个组合框(A 和 B)。我使用 sys.columns 填充了一个组合框 A,其中包含表的列名。现在,当我在组合框 A 中选择一个项目时,组合框 B 应该填充相同的项目,除了在组合框 A 中选择的选定项目。
【问题讨论】:
标签: c#
您应该删除这个问题或this one,它们是关于相同的事情。无论如何,这是我相同的答案:
在A的选中项更改事件中,添加清除B的代码,然后循环A的Item集合中的每个项目并将其添加到B只要当前项目的索引与中的SelectedItem的索引不同A.
类似的东西(伪代码,未经测试)
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);
也应该这样做。
【讨论】:
我会结合使用静态扩展方法和 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!
注意:可能有比返回列表项数组更有效的方法,但就全局而言(例如整体性能等),我认为这不是一个大问题.....
【讨论】:
我认为您必须在 A 的更改事件中对 B 的填充/删除进行编码
【讨论】:
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());
【讨论】: