さて、私はASP.NETにかなり慣れていませんが、何が起こっているのか理解していると思います。私はそれらの中でレポートを作成する任務を負っています。これまでのところ、この1つの問題を除いてすべてを停止しました。
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
要素IDを受け取り、テーブルを表示または非表示にするJavascript関数があります。
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」が吐き出されます。最初は機能しましたが、リピーターが新しい行にバインドされ、「ctl01_drillDownTable0」などが表示されます。
上記のコードでセルに属性を追加するClientID、ID、UniqueIDを試しましたが、必要な処理が実行されません。
そのIDを取得してJavascript関数に渡す方法はありますか?または、より良い質問は次のとおりです。IDはいつ生成され、ページがHTMLでレンダリングされる前にIDにアクセスできますか?