3

我确信我缺少一些简单的东西,但我必须承认,在这一点上我不知所措。

我以编程方式将 TabItems 添加到我的主 TabControl 中,用户选择打开的每个帐户一个。在创建和添加新的 TabItem 之前,我想检查用户是否已经在另一个选项卡中打开了该帐户。我不想最终打开两个相同的选项卡。

这是我最初编写的代码。希望它能让您了解我要完成的工作。

    if (tab_main.Items.Contains(accountNumber))
    {
        tab_main.SelectedIndex = tab_main.Items.IndexOf(accountNumber);
    }
    else
    {
        Search s = new Search(queryResults, searchText);
        TabItem tab_search = new TabItem();
        tab_search.Header = searchString;
        tab_search.Name = accountNumber;
        tab_search.Content = s;
        tab_main.Items.Add(tab_search);
    }

当然,这不能正常工作。在 WinForms 中,TabControl 有一个 TabPages 集合,其中包含一个 ContainsKey 方法,我可以使用它来搜索 TabPage 的名称。我不明白 Items.Contains() 方法在寻找什么,因为它只指定一个对象作为参数并且不引用项目的名称!

非常感谢任何和所有帮助。

谢谢!

4

2 回答 2

9

Contains()方法正在寻找您传递TabItem您正在寻找的实际,所以它不会帮助您。但这会起作用:

var matchingItem =
  tab_main.Items.Cast<TabItem>()
    .Where(item => item.Name == accountNumber)
    .FirstOrDefault();

if(matchingItem!=null)
  tab_main.SelectedItem = matchingItem;
else
  ...
于 2010-02-17T00:37:30.463 回答
1

感谢您的回复!在编辑之前它不起作用,我最终想出了另一个类似的解决方案。当然让我想到了正确的方向!我仍然不太习惯 LINQ 和 lambda 表达式。

如果其他人正在寻找解决方案,这也对我有用:

var matchingItem = 
    from TabItem t in tab_main.Items where t.Name == searchHash select t;

if (matchingItem.Count() != 0)
    tab_main.SelectedItem = matchingItem.ElementAt(0);
else
    ...

最后一个问题,如果有人正在阅读这篇文章......是否有一种更优雅的方法可以通过引用 name 属性从 matchItem 中选择元素,而不是假设正确的元素位于位置 0?

于 2010-02-17T01:21:23.610 回答