0

我有一个在 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 上选中

当我尝试将根节点设置为选中时出现此错误:

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

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

有谁知道我该怎么做?

4

2 回答 2

1

在控件的事件运行之前,数据不存在DataBinding,这可能会或可能不会在事件期间Load发生。您应该将任何需要数据/节点存在的代码放入DataBound控件的事件中。请参阅此文档

数据绑定

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

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

于 2012-09-24T19:32:38.977 回答
1

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

于 2012-09-26T21:34:48.583 回答