2012-04-19 1 views
0

申し訳ありませんが、私はASP.NETについてかなり新しいですが、何が起こっているのか理解していると思います。私は彼らの中にレポートを作成する任務がありました。これまでのところ、この1つの問題を除いてすべてがダウンしています。ASPテーブルコントロールを表示/非表示にするにはどうすればよいですか? (それほど単純ではありません)

DataRowCollectionにデータバインドされたRepeaterを使用して、それを介してプログラムでテーブルを構築します。 、私の人生のために、私はできません

function displayDetailTable(tableID) { 
    var table = document.getElementById(tableID) 
    if (table.style.display == "none") { 
     table.style.display = "table"; 
    } 
    else { 
     table.style.display = "none"; 
    } 
} 

パスを:私は要素のIDと非表示になりますまたはテーブルを示しJavascriptの機能を持っている

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で。私が理解していることから、ASP.NETは一意性のために、私が割り当てたIDをいくつかの巨大なロングIDに変換します。たとえば、ID「drillDownTable0」のテーブルを割り当て、HTMLマークアップに 'ctl00_drillDownTable0'を吐き出します。それは初めてのことでしたが、Repeaterは新しい行にバインドされ、その後、「ctl01_drillDownTable0」などが表示されます。

私は上記のコードでセルに属性を追加するClientID、ID、およびUniqueIDを試しましたが、必要な処理を行っていません。

私はそのIDを取得してJavascript関数に渡す方法はありますか?または、私はより良い質問があると思います:いつIDが生成され、ページがHTMLでレンダリングされる前にそれらにアクセスできますか?

答えて

1

おそらく ClientID探している:

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

それとは別に、私はRepeaterのItemCreatedイベントで動的にコントロールを作成することをお勧めします。すべてのポストバックですべての動的コントロールを再作成する必要があります。 ItemDataBoundはデータバインディングでのみ呼び出され、ItemCreatedはすべてのポストバックで呼び出されます。

を編集してください:あなたはすでにClientIDを試したことがあります。しかし、ItemdataBoundにテーブルを作成することによって問題が発生する可能性があります。

+0

UniqueID、ID、およびClientIDの結果をデバッグ出力ウィンドウに出力すると、HTMLにあるIDではなく、テーブルに割り当てられたIDである「drillDownTable0」が表示されます。 Repeater自体はPage_Initで作成された動的コントロールです。それはそれと関係がありますか? – duraz0rz

+0

@Duracell:ItemCreatedにテーブルを作成します。 DataItemにアクセスする必要がある場合は、ItemDataBoundのテーブルに入力することができます。 'FindControl(" drillDownTable "&e.Item.ItemIndex)'を使ってあなたのテーブルへの参照を取得してください。しかし、ItemCreatedで早く(ページのライフサイクルで)作成してください。とにかくClientIDを使用する必要があります。 ItemDataBoundに 'onclick'イベントを追加してください。 –

+0

@Duracell:あなたは設定が複雑すぎ、エラーを起こしやすいです。なぜテーブルを動的に作成するのですか(そしてリピータも)? aspxで宣言的にそれらを作成できませんでしたか? –

関連する問題