好吧,我是相当新的ASP.NET,但我想我明白这是怎么回事,。我一直负责制作报告。到目前为止,除了这个问题之外,我已经把所有的东西都解决了如何让我的ASP表格控件显示/隐藏? (不是那么简单,因为它听起来)
我使用数据绑定真实的DataRowCollection并通过编程建立一个表中的中继器。我有类似的东西:
Private Sub SubAcctGrid_OnItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
Dim currentrow = TryCast(e.Item.DataItem, DataRow)
Dim acctSummaryTable = New Table With {.ID = "acctSummary" & e.Item.ItemIndex, .CssClass = "minisub_acct_table"}
Dim drillDownTable = New Table With {.ID = "drillDownTable" & e.Item.ItemIndex, .CssClass = "drilldown_table"}
' Build both tables here
acctSummaryTable.Rows(1).Cells(0).Attributes.Add("onclick", String.Format("displayDetailTable('{0}')", drillDownTable.ID))
acctSummaryTable.Rows(1).Cells(1).Attributes.Add("onclick", String.Format("displayDetailTable('{0}')", drillDownTable.ID))
e.Item.Controls.Add(acctSummaryTable)
e.Item.Controls.Add(drillDownTable)
End If
End Sub
我有一个JavaScript函数,它的元素ID和隐藏或显示表:
function displayDetailTable(tableID) {
var table = document.getElementById(tableID)
if (table.style.display == "none") {
table.style.display = "table";
}
else {
table.style.display = "none";
}
}
我不能,我的生活,传递在正确的元素ID中,尽管如此。据我所知,为了唯一性,ASP.NET将我分配的ID转换成一些巨大的长ID。例如,我分配一个ID为'drillDownTable0'的表,并在HTML标记中分出'ctl00_drillDownTable0'。它第一次工作,但是然后Repeater被绑定到一个新行,然后我得到'ctl01_drillDownTable0'等等等等。
我已经尝试了客户端ID,ID和UniqueID的,我的属性添加到细胞在上面的代码,他们没有做什么,我需要。
有没有什么办法可以得到ID,并将其传递给JavaScript函数?或者我想一个更好的问题是:什么时候生成的ID,我可以在页面呈现在HTML之前,他们到达他们?
当我输出的UniqueID,ID,客户端ID和到调试输出窗口中的结果,我得到“drillDownTable0”,这是我分配表中,而不是这是在HTML中的ID的ID。请注意,我的Repeater本身是一个在Page_Init中创建的动态控件。可能与它有关系吗? – duraz0rz 2012-04-19 21:51:37
@Duracell:在ItemCreated中创建表格。如果您需要访问DataItem,则可以填充ItemDataBound中的表格。使用FindControl(“drillDownTable”&e.Item.ItemIndex)'来获取对表的引用。但是可以在ItemCreated中更早地创建它(在页面的生命周期中)。无论如何你必须使用ClientID。在ItemDataBound中添加你的'onclick'事件(和现在一样)。 – 2012-04-19 21:54:21
@Duracell:你的设置太复杂,容易出错。为什么你动态创建表(还有中继器)?难道你不能在aspx上声明创建它们吗? – 2012-04-19 22:07:44