0

テーブルから入力されるフォルダ/リンクのツリービュータイプの構造があります。私がやろうとしていたのは、レコードセットを介して手続き型ループを実行し、page_initでhtmlを生成してから、コントロールをバインドしようとしたことです。リンクボタンをhtmlのプレースホルダーに追加しようとすると、それらが見つからないように見えます。

私はここで基本的な何かを見逃しているかもしれません、私が見たすべての例はすでにページ上にあるコントロールをバインドします、私はpage_initで自分でhtmlを生成することができませんか?

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
  content_div.Innerhtml = "<asp:PlaceHolder id=""test"" runat=""server"" ></asp:PlaceHolder>"
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
   Dim _linkb As New LinkButton
   _linkb.ID = "lb_cat_" & cat.uID
   _linkb.Attributes.Add("href", "javascript: sltoggle('cat_" & cat.uID & "');")
   _linkb.Attributes.Add("Text", "Expand/Close")
   _linkb.Attributes.Add("runat", "server")
   Dim ph As PlaceHolder = DirectCast(TRIEDEVERYTHINGUNDERTHESUN.FindControl("test"), PlaceHolder)
   ph.Controls.Add(_linkb)
End Sub

誰かが私を正しい方向に向けることができれば、それは大いにありがたいです

よろしく、ピート

更新-完全なコード

Private Sub load_dynamic_file_view()
    Dim _sb As New StringBuilder
    Dim _sfc As New sf_file_category, _sff As New sf_file
    _lsfc = _sfc.get_all_sf_file_category
    _lsff = _sff.get_active_sf_files

    Dim _list_root As List(Of sf_file_category) = _lsfc.FindAll(Function(p) p.parent_id = 0)
    If Not _list_root Is Nothing Then
        _sb.Append("<strong>File Downloads</strong><br />")
        _sb.Append("<div class=""indent-me"" ><br />")
        For Each cat As sf_file_category In _list_root
            'header/Open Link
            Dim _linkb As New LinkButton
            _linkb.ID = "lb_cat_" & cat.uID
            _linkb.Attributes.Add("href", "javascript: sltoggle('cat_" & cat.uID & "');")
            _linkb.Attributes.Add("Text", "Expand/Close")
            _linkb.Attributes.Add("runat", "server")
            Dim ph As PlaceHolder = DirectCast(Me.Master.FindControl("lb_cat_" & cat.uID), PlaceHolder)
            ph.Controls.Add(_linkb)

            _sb.Append(HtmlDecode(cat.name) & " &nbsp;&nbsp;&nbsp;<Asp:PlaceHolder id=""lb_cat_" & cat.uID & """ runat=""server"" /><br />")
            '_sb.Append("<div id=""cat_" & cat.uID & """ class=""toggle-hide"">")
            '_sb.Append(add_child_folder(cat.uID, content))
            '_sb.Append(show_files(cat.uID, content))
            '_sb.Append("</div><div class=""clearfix"" />")
        Next
        _sb.Append("</div>")
        _sb.Append("<br /><br />")
    End If

    content_div.InnerHtml = _sb.ToString
End Sub

Private Function add_child_folder(ByVal catid As Long, ByRef content As ContentPlaceHolder) As String
    Dim _sb As New StringBuilder
    Dim _cl As List(Of sf_file_category) = _lsfc.FindAll(Function(p) p.parent_id = catid)
    If Not _cl Is Nothing Then
        _sb.Append("<div class=""indent-me"" ><br />")
        'For Each _c As sf_file_category In _cl.OrderBy(Function(p) p.view_order)

        _cl.Sort(Function(c1 As sf_file_category, c2 As sf_file_category)
                     Return c1.view_order.CompareTo(c2.view_order)
                 End Function)

        For Each cat As sf_file_category In _cl
            Dim _linkb As New LinkButton
            _linkb.ID = "lb_cat_" & cat.uID
            _linkb.Attributes.Add("href", "javascript: sltoggle(&#39;cat_" & cat.uID & "&#39;);")
            _linkb.Attributes.Add("Text", "Expand/Close")
            _linkb.Attributes.Add("runat", "server")
            Content.Controls.Add(_linkb)

            _sb.Append(HtmlDecode(cat.name) & "&nbsp;&nbsp;&nbsp;<Asp:LinkButton id=""lb_cat_" & cat.uID & """ runat=""server"" Text=""Expand/Close"" href=&#39;javascript: sltoggle(&#39;cat_" & cat.uID & "&#39;);&#39; /><br />")
            '_sb.Append("<div id=""cat_" & cat.uID & """ class=""toggle-hide"">")
            _sb.Append(add_child_folder(cat.uID, content))
            _sb.Append(show_files(cat.uID, content))
            '_sb.Append("</div><div class=""clearfix"" >")
        Next
        _sb.Append("</div><br />")
    End If

    Return _sb.ToString
End Function

Private Function show_files(ByVal catid As Long, ByRef content As ContentPlaceHolder) As String
    Dim _sb As New StringBuilder
    Dim _fl As List(Of sf_file) = _lsff.FindAll(Function(p) p.file_category = catid)
    If Not _fl Is Nothing Then
        _sb.Append("<div class=""indent-me"" ><br />")
        For Each _f As sf_file In _fl
            Dim _linkb As New LinkButton

            _linkb.ID = "file_" & _f.uID
            _linkb.Attributes.Add("onCommand", "download_file")
            _linkb.Attributes.Add("CommandArgument", _f.uID.ToString)
            _linkb.Attributes.Add("Text", _f.file_name)
            _linkb.Attributes.Add("runat", "server")
            AddHandler _linkb.Command, AddressOf download_file
            content.Controls.Add(_linkb)

            _sb.Append("<asp:LinkButton id=""file_" & _f.uID & """ runat=""server"" onCommand=""download_file"" commandArgument=""" & _f.uID & """ Text=""" & _f.file_name & """ /><br />")
        Next
        _sb.Append("</div><br />")
    End If
    Return _sb.ToString
End Function
4

4 に答える 4

0

にプレースホルダーを追加しようとしているように見えますcontent_divが、タグを HTML コンテンツとしてレンダリングしています。

コントロールの種類が正確にはわかりませんcontent_divが、試してみることはできません:

content_div.controls.add(new placeholder() { ID = "test" });

これにより、コントロール内でコントロールを見つけることができますcontent_div

ただし、おそらくより簡潔な解決策は次のようになります。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
   Dim _linkb As New LinkButton
   _linkb.ID = "lb_cat_" & cat.uID
   _linkb.Attributes.Add("href", "javascript: sltoggle('cat_" & cat.uID & "');")
   _linkb.Attributes.Add("Text", "Expand/Close")
   //you don't need this when using code behind
   //_linkb.Attributes.Add("runat", "server")

   //this will add your linkbutton to the content_div control
   content_div.Controls.Add(_linkb)
End Sub

これを前に与えると、ASP コントロールを使用してページを動的に構築する便利な方法であることがわかるはずです。

于 2012-09-18T08:42:26.700 に答える
0

あなたの完全なコードが示しているのは、大量の HTML 文字列を作成していることです。これはいくつかの小さな状況では問題ありませんが、コードが明らかにかなり大きくなっているので、このアプローチを変更することをお勧めします。

次のような Web コントロールに相当するものを宣言することをお勧めします。

new HtmlGenericControl("div") instead of <div></div>

また

new HtmlAnchor() OR new LinkButton() instead of <a></a>

ツリー構造の例では、HTML は次のようになります。

<ul>
    <li>
        <a href="root.htm">ROOT</a>
        <ul>
            <li>
                <a href="levelone">LEVEL 1</a>
            </li>
        </ul>
    </li>
</ul>

これをコードで生成するには、次のようにします。

'Menu Holder
Dim treeStruct As HtmlGenericControl("ul")

'Root
Dim branch As HtmlGenericControl("li")
Dim branchItem as HtmlAnchor("a")

'Level 1 
Dim subLevel As HtmlGenericControl("ul")
Dim subBranch As HtmlGenericControl("li")
Dim subBranchItem as HtmlAnchor("a")

'Setup Level 1
subBranchItem.InnerText = "LEVEL 1"
subBranchItem.Href = "levelone"

subBranch.Controls.Add(subBranchItem)
subLevel.Controls.Add(subBranch)

'Setup Root
branchItem.InnerText = "ROOT"
branchItem.Href = "root.htm"

'Add Link To Root
branch.Controls.Add(branchItem)
'Add Sub Branch To Root
branch.Controls.Add(subLevel)

treeStruct.Controls.Add(branch)

重要上記のコードは単なる例です。理想的には、ブランチを作成するために機能を関数に分割してから、for ループで要素をループします。

また、ツリー構造を順序付けられていないリストと見なすため、<UL>代わりにを使用したことにも気付くでしょう。<DIV>さらに、このより隆起した構造からスタイリングの利点も得られます。

これが役立つことを願っています

于 2012-09-18T12:06:16.527 に答える
0

HTML タグのみを生成し、ASP.Net タグはブラウザーで解析できないため、生成しません。

あなたのコードは次のようになるべきだと思います

content_div.Innerhtml = "<div id='test'></div>"

ASP:プレースホルダー コントロールは単なるプレースホルダーであり、div HTML タグとは異なります。例として、ここで div タグを指定しました。

于 2012-09-18T08:48:43.980 に答える
0

テキストとして追加されたasp.netコントロールはページに認識されないため、ビューステート/オブジェクトが保存されないため、Findcontrolを使用して見つけることはできません.

コントロールのオブジェクトを使用して、親コントロールの Control コレクションに追加します。

div.Controls.Add(new PlaceHolder() { ... });

Render イベントの前に追加すると、その状態が保存され、アクセス可能になります。

于 2012-09-18T09:16:55.093 に答える