web-dev-qa-db-ja.com

ASP.NET TreeViewと選択済みの選択Node

選択のクリックのイベントをキャプチャするにはどうすればいいですかNode?)SelectedNodeChangedは発生しません。 Selected Nodeがクリックされたことを知っているので、キャッチできますか?

[〜#〜] update [〜#〜]:時間があれば、TreeViewコントロールの内部に飛び込み、クリックを処理する対象と場所を掘り下げる必要があります。イベントとTreeViewをサブクラス化して、新しいイベントOnSelectedNodeClickedを公開します。

私はおそらくクリスマス休暇中にこれを行い、結果を報告します。

[〜#〜] update [〜#〜]:TreeViewコントロールのサブクラスの下にあるソリューションを考え出しました。

13
BlackMael

最も簡単な方法-コードの残りの部分に干渉しない場合-は、ノードをSelectedNodeChangedメソッドで選択されていないものとして設定することです。

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){
  // Do whatever you're doing
  TreeView1.SelectedNode.Selected = false;
}
8
Wayne

やや長い期間の後、ようやくTreeViewをサブクラス化してSelected Nodeクリックされたものを処理するための方法です。

これは、新しいイベントを公開する私のソリューションですSelectedNodeClickedこれは、ページまたはどこからでも処理できます。 (必要に応じて、C#にリファクタリングするのは簡単な作業です)

Imports System.Web.UI
Imports System.Web


Public Class MyTreeView
  Inherits System.Web.UI.WebControls.TreeView

  Public Event SelectedNodeClicked As EventHandler

  Private Shared ReadOnly SelectedNodeClickEvent As Object

  Private Const CurrentValuePathState As String = "CurrentValuePath"

  Protected Property CurrentValuePath() As String
    Get
      Return Me.ViewState(CurrentValuePathState)
    End Get
    Set(ByVal value As String)
      Me.ViewState(CurrentValuePathState) = value
    End Set
  End Property

  Friend Sub RaiseSelectedNodeClicked()

    Me.OnSelectedNodeClicked(EventArgs.Empty)

  End Sub

  Protected Overridable Sub OnSelectedNodeClicked(ByVal e As EventArgs)

    RaiseEvent SelectedNodeClicked(Me, e)

  End Sub

  Protected Overrides Sub OnSelectedNodeChanged(ByVal e As System.EventArgs)

    MyBase.OnSelectedNodeChanged(e)

    ' Whenever the Selected Node changed, remember its ValuePath for future reference
    Me.CurrentValuePath = Me.SelectedNode.ValuePath

  End Sub

  Protected Overrides Sub RaisePostBackEvent(ByVal eventArgument As String)

    ' Check if the node that caused the event is the same as the previously selected node
    If Me.SelectedNode IsNot Nothing AndAlso Me.SelectedNode.ValuePath.Equals(Me.CurrentValuePath) Then
      Me.RaiseSelectedNodeClicked()
    End If

    MyBase.RaisePostBackEvent(eventArgument)

  End Sub

End Class
6
BlackMael

選択したものを保存し、Page_Loadイベントハンドラーのコードを使用して、選択したものと保存したものを比較します。 SelectedNodeChangedとは異なり、選択された値が変更されない場合でも、すべてのポストバックに対してPage_Loadが呼び出されます。

代替テキストhttp://smithmier.com/TreeViewExample.png

html

<form id="form1" runat="server">
<div>
    <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"
        ShowLines="True">
        <Nodes>
            <asp:TreeNode Text="Root" Value="Root">
                <asp:TreeNode Text="RootSub1" Value="RootSub1"></asp:TreeNode>
                <asp:TreeNode Text="RootSub2" Value="RootSub2"></asp:TreeNode>
            </asp:TreeNode>
            <asp:TreeNode Text="Root2" Value="Root2">
                <asp:TreeNode Text="Root2Sub1" Value="Root2Sub1">
                    <asp:TreeNode Text="Root2Sub1Sub1" Value="Root2Sub1Sub1"></asp:TreeNode>
                </asp:TreeNode>
                <asp:TreeNode Text="Root2Sub2" Value="Root2Sub2"></asp:TreeNode>
            </asp:TreeNode>
        </Nodes>
    </asp:TreeView>
    <asp:Label ID="Label1" runat="server" Text="Selected"></asp:Label>
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label></div>
</form>

C#

protected void Page_Load(object sender, EventArgs e)
{
    if(TreeView1.SelectedNode!=null && this.TextBox1.Text == TreeView1.SelectedNode.Value.ToString())
    {
        Label2.Text = (int.Parse(Label2.Text) + 1).ToString();
    }
    else
    {
        Label2.Text = "0";
    }
}
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
    this.TextBox1.Text = TreeView1.SelectedNode.Value.ToString();
}
4
Larry Smithmier

_TreeNodePopulate()イベントでツリーにノードを追加するときは、ノードの.SelectionActionプロパティを設定します。

TreeNode newCNode;
newCNode = new TreeNode("New Node");

newCNode.SelectAction = TreeNodeSelectAction.Select;

//now you can set the .NavigateUrl property to call the same page with some query string parameter to catch in the page_load()

newCNode.NavigateUrl = "~/ThisPage.aspx?args=" + someNodeAction

RootNode.ChildNodes.Add(newCNode);
1
Drell

c#:

TreeNode node = TreeTypes.FindNode(obj.CustomerTypeId.ToString());


TreeTypes.Nodes[TreeTypes.Nodes.IndexOf(node)].Select();
1
Randa Hesham
protected void Page_Load(object sender, EventArgs e) 
    {
        if (!IsPostBack)
        {
            TreeView1.SelectedNode.Selected = false;
        }
    }

私のために働く

1
Evren

常にMouseDownイベントまたはMouseUpイベントを使用して、選択したノードかどうかを確認できます。

0
Blackadder

ShowCheckBoxプロパティとCheckedプロパティを使用して、選択したアイテムを「強調表示」します。 SelectedNodeChangedイベントが発生したとき:

  1. 以前に選択したもののShowCheckBoxプロパティとCheckedプロパティをfalseに設定し、ShowCheckBoxプロパティとCheckedプロパティをtrueに設定しました新しく選択したもの。
  2. 選択したノードを任意のアクションに使用します
  3. 最後に、選択したアイテムの選択を解除します:myTreeView.SelecteNode.Selected = false
0
French Refilou