2

まず、この質問はこの質問のフォローアップです。質問の半分しか答えられなかったような気がします。

tabItemsで参照されているを削除するだけでなく、それらの を参照しNameて削除できる必要もあります。tabItemsHeaders

私の答えを実装してに変更n.Nameするとn.Header、次のようになります。

var tabToDelete = tabControl.Items.OfType<TabItem>().SingleOrDefault(n => n.Header == stringValue);
if (tabToDelete != null) 
tabControl.Items.Remove(tabToDelete);

同じようには機能しないことがわかりました。これでうまくいくはずですか、それともこの構造全体を編集する必要がありますか? tabItemもしそうなら、必要なものがによって参照されていることを確認するにはどうすればよいHeaderですか?

追加: によって参照されるタブNameが削除されると、それらは画面から削除されますが、によって参照されるタブは削除されHeaderません (手動でタブを切り替えるまで)。これは、それらがまだプログラムに存在していると私に思わせます。

4

2 に答える 2

1

Ryan が言ったように、問題はHeader単なるテキストではなくコントロールになる可能性があることです。どちらも null 値からの変換を処理できるのに対し、例外が生成されるため、Headerよりもnull優れてas Stringいる場合があります。Convert.ToString()toString()ToString()

UsingConvert.ToString()はやり過ぎかもしれませんが、ヘッダーが暗黙的に文字列に変換できない値 (整数など) にバインドされている場合は、usingConvert.ToString()でそれらを処理できます。また、このソリューションは、同じヘッダー値を持つ複数のアイテムが存在する場合にも対応します。

private void RemoveTabByHeader(string str) 
{
    TabsMain.Items.OfType<TabItem>().Where(t => Convert.ToString(t.Header) == str)
       .ToList().ForEach(t => TabsMain.Items.Remove(t));
}

これはテスト済みです。TabControl正しく更新されます。

于 2013-08-16T20:58:16.367 に答える
1

あなたの問題は、それHeaderが文字列ではなくオブジェクトであることです。2 つの値をあたかもそうであるかのように比較していますが、Header はオブジェクトであるため、実際には値の比較ではなく、参照の比較を行っています。onHeaderを呼び出すだけで文字列にキャストする必要があります。.ToString()Header

var tabToDelete = tabControl.Items.OfType<TabItem>().SingleOrDefault(n => (n.Header as string) == stringValue);
if (tabToDelete != null)
    tabControl.Items.Remove(tabToDelete);

これで問題が解決しない場合は、次を呼び出してコントロールを強制的に再描画できます。

tabControl.Refresh();

アップデート

可能性のある null 参照例外を発見した Daniel Gimenez の功績です。がコントロールに設定されているという問題Headerは問題ではありませんが、すべてのオブジェクトが を呼び出すことができるToString()ため、実際の問題はHeaderがまったく設定されていない場合にnullオブジェクトになります。

于 2013-08-16T20:53:42.127 に答える