如何让我的ASP表控件显示/隐藏? (不像听起来那么简单)

时间:2012-04-19 21:32:58

标签: javascript asp.net vb.net

好吧,我对ASP.NET很新,但我想我明白发生了什么。我的任务是在其中构建报告。到目前为止,除了这一个问题,我已经把所有事情都搞定了。

我使用一个数据绑定到DataRowCollection的Repeater,并以编程方式构建一个表。我有类似的东西:

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'等等。

我已经尝试过ClientID,ID和UniqueID,我在上面的代码中将属性添加到Cells中,但它们没有做我需要的。

有什么方法可以获得该ID并将其传递给Javascript函数?或者我想一个更好的问题是:什么时候生成ID,我可以在用HTML呈现页面之前找到它们吗?

1 个答案:

答案 0 :(得分:1)

您可能正在寻找ClientID

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

除此之外,我建议在Repeater的ItemCreated事件中动态创建控件。您必须在每次回发时重新创建所有动态控件。仅在数据绑定时调用ItemDataBound,而在每次回发时调用ItemCreated

修改:我刚刚看到您已经尝试过ClientID。但这可能是因在ItemdataBound中创建表而导致的问题。