0

ASP.NET 4.0 Webアプリケーションを開発していて、TreeViewコントロールを使用しています。なぜこれが起こっているのか本当に理解できないという問題が1つあります。ツリーアイテムに関連付けられたチェックボックスがあります。

チェックボックスがチェックされていない場合、すべてが正常に機能しますが、次の行を実行すると次のようになります。

node.ChildNodes.Clear();

ノードのチェックボックスがオンになっている場合、Clear()の後のnode.Parentはnullです。チェックされていない場合でも、親は正しいです。childnodesコレクションをクリアすると、親参照もクリアされる理由がよくわかりません。私は実際には、この呼び出し内でチェックされたプロパティを使用または変更しません。また、私の親も私のノードの子ではないことを100%確信しています(チェックしたかどうかで異なるのはなぜですか)。

コードが期待どおりに機能するために使用する必要がある回避策は次のとおりです。

TreeNode[] checkedNodes = new TreeNode[tvResults.CheckedNodes.Count];
tvResults.CheckedNodes.CopyTo(checkedNodes, 0);
foreach (TreeNode checkedNode in checkedNodes) // Uncheck all nodes temporary.
    checkedNode.Checked = false;

node.ChildNodes.Clear(); // Now it is ok to clear and parent is "saved".

foreach (TreeNode checkedNode in checkedNodes) // Recheck all checked nodes again.
    checkedNode.Checked = true;

この問題について誰かアイデアはありますか?

ありがとう、マティアス

PS!親切にしてください、これは私の最初の質問です...

4

1 に答える 1

0

以下は、ASP.NET TreeNodeCollection.Clear(.NET 4.5から)のコードです。ご覧のとおり、検証を実行せずに、チェックされたすべてのノードをクリアします。したがって、これは設計によるものであり(設計によるバグではなく)、コードのバグではありません。私のアドバイスは、質問にリストした回避策を実行する拡張メソッドを追加して、簡単に再利用できるようにすることです。

// System.Web.UI.WebControls.TreeNodeCollection
/// <summary>Empties the <see cref="T:System.Web.UI.WebControls.TreeNodeCollection" /> object.</summary>
public void Clear()
{
if (this.Count == 0)
{
    return;
}
if (this._owner != null)
{
    TreeView owner = this._owner.Owner;
    if (owner != null)
    {
        if (owner.CheckedNodes.Count != 0)
        {
            owner.CheckedNodes.Clear();
        }
        for (TreeNode treeNode = owner.SelectedNode; treeNode != null; treeNode = treeNode.Parent)
        {
            if (this.Contains(treeNode))
            {
                owner.SetSelectedNode(null);
                break;
            }
        }
    }
}
foreach (TreeNode current in this._list)
{
    current.SetParent(null);
}
this._list.Clear();
this._version++;
if (this._isTrackingViewState)
{
    this.Log.Clear();
}
this.Log.Add(new TreeNodeCollection.LogItem(TreeNodeCollection.LogItemType.Clear, 0, this._isTrackingViewState));
}
于 2013-03-15T11:25:57.213 に答える