我正在尝试使用数据绑定器进行循环,但它没有按计划运行,我不知道为什么。
Session("mysession") = "1234-5678-"
Dim delimiters As Char() = New Char() {"-"C}
Dim nodes As XmlNodeList
Dim mystring As String() = Trim(Session("mysession")).Split(delimiters, StringSplitOptions.RemoveEmptyEntries)
For x = 0 to mystring.Length - 1
nodes = doc.SelectNodes("this/that[@number='" & mystring(x) & "']/something/blah")
Response.write(mystring(x))
repeater.DataSource = nodes
repeater.DataBind()
Next
我知道它正在通过循环正确,因为我放了response.write
但它只是数据绑定字符串中的最后一个条目
我有什么想法可以让它对每个字符串进行数据绑定,而不仅仅是最后一个字符串?
由于
答案 0 :(得分:1)
您正在循环中调用DataBind()。每次通过它都会覆盖以前的绑定值。
答案 1 :(得分:1)
你正在重新绑定循环的每次迭代,所以在循环结束后它将绑定到你告诉它绑定的最后一件事,这是循环的最后一次迭代。
(注意:数据绑定并不意味着“将此数据附加到控件的现有数据”,而是“将此数据用于控件。”这是一种破坏性操作,取代之前的操作。)
您应该首先构建数据源(可能是使用循环),然后在循环完成后绑定到完全构建的数据源。据推测,这意味着您需要在每次迭代时追加到nodes
,而不是将分配给它(它会覆盖已存在的内容)。但是,您需要稍微调试并确保附加版本在数据方面仍然有意义并且仍然可以绑定。它可能需要在循环迭代等之间进行一些描述。
答案 2 :(得分:1)
每次DataBind()
都会覆盖以前的DataSource
。与nodes = doc.SelectNodes("this/that[@number='" & mystring(x) & "']/something/blah")
相同。
将那些移动到循环之外,而不是
XmlNodeList
,将新节点附加到nodes += doc.SelectNodes("this/that[@number='" & mystring(x) & "']/something/blah")
。
{{1}} 或者等效的VB代码。
答案 3 :(得分:0)
<Repeater ID="outerrepeater">
<Repeater ID="innerrepeater" />
</Repeater>
然后在你的代码中
PageLoad or whatever
{
outerrepeater.OnDataBound += new RepeaterDataBoundEvent(databind); //or is it ondatabinding
outerrepeater.DataSource = mystring;
outerrepeater.DataBind();
}
void databind(object sender, EventArgs e)
{
Repeater inner = ((Repeater)((Repeater)sender).FindControl("innerrepeater"));
inner.DataSource = doc.SelectNodes("this/that[@number='" & mystring(x) & "']/something/blah");
inner.DataBind();
}
对不起,这是在C#中,但这是我认为你想要做的一般的主旨。
答案 4 :(得分:0)
我通过在转发器中使用asp:XmlDataSource
来修复此问题,然后在转发器OnItemDataBound
事件上执行了我的Databind