3

私が見逃している単純なものがあると確信していますが、この時点で私は途方に暮れていることを告白しなければなりません.

ユーザーが開くことを選択したアカウントごとに、TabItems をメインの TabControl にプログラムで追加しています。新しい TabItem を作成して追加する前に、ユーザーが既に別のタブでアカウントを開いているかどうかを確認したいと思います。まったく同じタブが 2 つ開いたままになりたくありません。

これが私が最初に書いたコードです。うまくいけば、私が達成しようとしていることのアイデアが得られます.

    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 には、TabPage の名前を検索するために使用できる、ContainsKey メソッドを含む TabPages コレクションがあります。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 とラムダ式に慣れていません。

他の誰かが解決策を探している場合、これも私にとってはうまくいきました:

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
    ...

誰かがこれを読んでいる場合の最後の質問...正しい要素が位置0にあると仮定するのではなく、nameプロパティを参照することにより、matchingItemから要素を選択するよりエレガントな方法はありますか?

于 2010-02-17T01:21:23.610 に答える