zu angelkicken TreeNode scrollen

AlexK
Hallo Wissende!

Ich schlage mich mit dem TreeView von ASP.NET 2.0 rum. Folgendes Scenario hätte ich gerne:

Mein TreeView soll die ChildNodes und ChildChild Nodes bei Bedarf nachladen. Darum erstelle ich beim Initalisieren des TV nur die Root. Beim Klick auf einen (Root)Node lade ich die entsprechenden ChildNodes nach.
Das klappt auch ganz gut. Allerdings wird mein TV u.U. sehr groß und wenn ich auf einen Node klicke, der weiter unten ist und dieser nachgeladen wird, steht der TV danach wieder oben am Anfang und der angeklickte Node ist irgendwo im nicht sichtbaren Bereich. Ich würde aber gerne zu dem angeklickten Node scrollen, damit der Benutzer diesen auch gleich wieder vor Augen hat... (hab ich das verständlich erklärt? verwundert )
Um zu dem angeklickten Node zu scrollen muss ich auf JavaScript zurück greifen. Dazu habe ich folgendes Script geschrieben:

Code:
1:
2:
3:
4:
5:
6:
7:
8:
function Scroll2Node(NodeID)
{
	var node = $get(NodeID);
	if(node != null)
	{
	    node.scrollIntoView(true);
	}
}

Damit dieses kleine Script funktioniert, brauch ich aber ein eindeutige ID. Da die TreeNodes die Eigenschaft "ID" nicht haben, habe ich mir CustomTreeNodes erstellt:

C#-Code:
public class CustomTreeNode : System.Web.UI.WebControls.TreeNode
{
    public CustomTreeNode(): base()
    { }

    private string _id;

    public string ID
    {
        get { return _id; }
        set { _id = value; }
    }

    protected override void RenderPreText(HtmlTextWriter writer)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Id, _id);
        writer.RenderBeginTag(HtmlTextWriterTag.Div);
        base.RenderPreText(writer);
    }

    protected override void RenderPostText(HtmlTextWriter writer)
    {
        writer.RenderEndTag();
        base.RenderPostText(writer);
    }
}

Jetzt kann ich meinem CustomTreeNode ein ID zuweisen:

C#-Code:
CustomTreeNode tnStandort = new CustomTreeNode();
tnStandort.Text = _standort["conName"].ToString();
tnStandort.Value = _standort["conID"].ToString();
tnStandort.ID = "A_" + _standort["conID"].ToString(); //CustomAttribut ID
tnStandort.SelectAction = TreeNodeSelectAction.Expand;

Der TV in der ASPX-Seite sieht so aus:

Code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<asp:TreeView 
	ID="tvMainTreeView" 
	runat="server" 
	CssClass="TreeView" 
	ShowLines="true"
	NodeStyle-CssClass="RootNodes"
	HoverNodeStyle-CssClass="HoverNodes"
	SelectedNodeStyle-CssClass="SelectedNode"
	EnableClientScript="false"
	OnTreeNodeExpanded="Node_Expand"
	OnSelectedNodeChanged="Select_Change">
</asp:TreeView>

Bei Initialisieren des TV, also beim erstellen der Root, finde ich die jeweiligen (Custom) IDs auch einwandfrei wieder. Nur wenn ich jetzt z.B. Funktion "Node_Expand" ausführen, die mir die ChildNodes nachlädt, verschwindet die ID wieder aus dem HTML-Sourcecode und ich kann natürlich nicht mehr per JavaScript draufzugreifen... Warum verschwindet die? Ich werd noch wahnsinnig! geschockt

Grüße, Alex
Peter Bucher
Salute AlexK

Du musst die Eigenschaft im ViewState speichern, dann bleiben die Werte auch nach einem PostBack erhalten.


Gruss Peter
AlexK
Hmmm, kleines Beispiel? enttäuscht
Peter Bucher
Hallo AlexK

Sehr naheliegender Suchbegriff "viewstate eigenschaf" bringt mich dahin:
-  http://www.google.ch/search?hl=de&q=view...tate+eigenschaf

oder dahin:
-  Beispiel für die Eigenschaften eines Serversteuerelements

Dort findest du deine Beispiele.
Und hier noch als Zitat aus den obigen Seiten:

C#-Code:
        public virtual string Title
        {
            get
            {
                string s = (string)ViewState["Title"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["Title"] = value;
            }
        }

Gruss Peter
TiltonJH
Hallo,

sorry, ich muss den Thread noch mal raus holen.

Ich würde gerne auch eine solche Funktionalität einbauen. Soweit auch alles kein Prob.

Nur wo bzw. wie muss ich denn dann die Java-Script Funktion aufrufen?

MfG

Tilton

PS: Meine Java-Script Kenntnisse sind nicht so dolle.