2012-04-19 35 views
0

好吧,我是相当新的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之前,他们到达他们?

回答

1

你可能寻找 ClientID

String.Format("displayDetailTable('{0}')", drillDownTable.ClientID) 

除此之外,我建议在Repeater的ItemCreated事件动态创建的控件。您必须在每个回传中重新创建所有动态控件。 ItemDataBoundItemCreated被称为在每个回发只叫上绑定。

编辑:我只看到你已经尝试过ClientID。但它可能是由在ItemdataBound中创建表引起的问题。

+0

当我输出的UniqueID,ID,客户端ID和到调试输出窗口中的结果,我得到“drillDownTable0”,这是我分配表中,而不是这是在HTML中的ID的ID。请注意,我的Repeater本身是一个在Page_Init中创建的动态控件。可能与它有关系吗? – duraz0rz 2012-04-19 21:51:37

+0

@Duracell:在ItemCreated中创建表格。如果您需要访问DataItem,则可以填充ItemDataBound中的表格。使用FindControl(“drillDownTable”&e.Item.ItemIndex)'来获取对表的引用。但是可以在ItemCreated中更早地创建它(在页面的生命周期中)。无论如何你必须使用ClientID。在ItemDataBound中添加你的'onclick'事件(和现在一样)。 – 2012-04-19 21:54:21

+0

@Duracell:你的设置太复杂,容易出错。为什么你动态创建表(还有中继器)?难道你不能在aspx上声明创建它们吗? – 2012-04-19 22:07:44

相关问题