web-dev-qa-db-ja.com

Windows.Forms.TreeViewにSelectedNodeChangedイベントがないのはなぜですか?

System.Web.UI.WebControls.TreeViewクラスはこのイベントを提供しますが、FormsバージョンのTreeViewは提供しません。フォームの世界で同等のものは何ですか? AfterSelectを使用していますが、正しくありません。多分それは実際に私が探しているものですが、ドキュメントは少しかすんでいます。

41
I. J. Kennedy

WinForms TreeViewには何もありません。 MSDNを TreeView.AfterSelect で引用するには:

ノードが選択されていない場合、このイベントは発生しません。この発生を検出するには、Control.MouseUpイベントを処理し、TreeNode.IsSelectedプロパティをテストします。

はい、これは最悪です。

38
Pavel Minaev

AfterSelectの使用には何の問題もありません。

ただし、選択がクリアされた場合は起動しません(SelectedNodenullになった場合)。代わりに、 ドキュメントで推奨されているようにMouseUpを処理できます

10
SLaks

OK、これはOOOLDの質問ですが、問題は本当に私を悩ませました。私はこの小さなヘルパークラスを作りました-それは私にとってはうまくいきます。

Public Class TreeViewSelectedNodeChangeEventHandler
Public Event SelectedTreeNodeChanged(sender As Object, e As EventArgs)

Private m_selectedNode As TreeNode
Private WithEvents m_tvw As TreeView

Public Shared Function FromTree(tree As TreeView) As TreeViewSelectedNodeChangeEventHandler
    If Not IsNothing(tree) Then
        Return New TreeViewSelectedNodeChangeEventHandler(tree)
    End If
    Return Nothing
End Function

''' <summary>Assigns 'Value' to 'this' and returns 'Value'.</summary>
Private Function InLineAssign(Of V)(ByRef this As V, value As V) As V
    Dim ret = value
    this = value
    Return ret
End Function

他のトリガーを追加できます。 Control.Enter、MouseUpなど.

Private Sub keyUp(sender As Object, e As KeyEventArgs) Handles m_tvw.KeyUp
    If Not Me.m_selectedNode Is InLineAssign(Me.m_selectedNode, m_tvw.SelectedNode)  

その後

    RaiseEvent SelectedTreeNodeChanged(m_tvw, EventArgs.Empty)
        End If
    End Sub
    Private Sub New(tv As TreeView)
        m_tvw = tv
    End Sub
End Class
3
Jens

WinForms TreeViewには何もありません。 TreeView.AfterSelectのMSDNを引用するには:

ノードが選択されていない場合、このイベントは発生しません。この発生を検出するには、Control.MouseUpイベントを処理し、TreeNode.IsSelectedプロパティをテストします。

TreeView.NodeMouseClickイベントをAfterSelectと組み合わせて使用​​する方がよいでしょう。以前に選択したSelectedNodeを選択した場合、AfterSelectは呼び出されません。したがって、必要なときにAfterSelectを呼び出すだけで、e.Nodeが役立ちます。

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (e.Node == tv.SelectedNode)
            treeView1_AfterSelect(sender, null);
    }
0
dobragab