将TreeView节点设置为在页面加载上选择

时间:2012-09-20 18:42:25

标签: c# asp.net

我有一个树视图,我正在动态加载PageLoad事件。这是我的树视图和数据源:

<asp:TreeView ID="tv" runat="server" DataSourceID="xds"
    SelectedNodeStyle-ForeColor="Red" NodeStyle-ForeColor="Black">   
    <DataBindings>
        <asp:TreeNodeBinding DataMember="Node"
            ValueField="Id" TextField="Title"  />
    </DataBindings>
</asp:TreeView>
<asp:XmlDataSource ID="xds" runat="server" EnableCaching="false" />

这是我在PageLoad上运行的代码

StringBuilder sb = new StringBuilder();
XmlWriter xw = XmlWriter.Create(sb);

WriteTreeViewXml(xw);
xw.Flush();
xw.Close();

xds.Data = sb.ToString();
xds.DataBind();

tv.Nodes[0].Selected = true;  // error here

这很好用,树视图正确加载。现在我正在尝试为SelectedNode添加样式。这在我单击特定节点时有效,但在页面加载时没有设置根节点的样式。所以我正在尝试将根节点设置为在PageLoad上选择

当我尝试将根节点设置为选中时,我收到此错误:

  

指数超出范围。必须是非负数且小于集合的大小。   参数名称:index

由于某种原因,在绑定数据源后树视图为空。

有谁知道我该怎么做?

2 个答案:

答案 0 :(得分:1)

在控件的DataBinding事件运行之前,数据不存在,这可能会在Load事件期间发生,也可能不会发生。您应该将需要数据/节点的任何代码存储到控件的DataBound事件中。见this documentation

  

数据绑定

     

在数据绑定控件中的数据绑定操作结束时引发。在GridView控件中,所有行和任何子控件都完成了数据绑定。

     

使用此事件格式化数据绑定内容或在依赖于当前控件内容值的其他控件中启动数据绑定。 (有关详细信息,请参阅本主题前面的已添加控件的追赶事件。)

答案 1 :(得分:1)

你需要在调用xds.DataBind()的行之后调用tv.Databind();否则,控件不会绑定到数据源。我相信如果您声明性地设置XmlDataSource(例如,设置为静态文件),它会为您执行此操作,但由于您手动填充它,因此您还需要手动调用控件的DataBind方法。