0

次のように、コードビハインドにhtmlを追加してWebコントロールを作成しています。

Dim sb As New StringBuilder
Dim myDiv As HtmlGenericControl = Me.theContainer

sb.Append("<table width='100%'  cellpadding='0' cellspacing='0' style='border:0px;'>" & vbCrLf)
sb.Append(" <tr class='mainRow1'>" & vbCrLf)
sb.Append("<td  align='left'  style='border:0px solid white;'>Main Menu</td>" & vbCrLf)
sb.Append("<td>" & vbCrLf)
sb.Append("<asp:Label ID='Label1' runat='server' Text='Label'></asp:Label>" & vbCrLf)
sb.Append("</td>" & vbCrLf)
sb.Append("<td  align='right' style='border:0px solid white;'>Sort By: Id | Name</td>" & vbCrLf)
sb.Append("</tr>" & vbCrLf)
sb.Append("</table>" & vbCrLf)

myDiv.InnerHtml = sb.ToString

これにより、分離コード内のテーブルのhtmlが生成され、指定されたDIV要素に挿入されます。私の質問は、この方法でコントロールを作成した場合、コードビハインドでメソッドを起動するイベントを追加するにはどうすればよいですか?たとえば、画像ボタンを作成する場合は、コードで次のようにします。

<asp:ImageButton CommandArgument='<%# (Container.DataItem.objectValue) %>'            
ID='ImageButton1' runat='server' OnCommand='Button1_Click' ImageUrl='~/images/folder.gif' />

しかし、背後にあるコードでは、これを行います:

sb.Append("<input type='image' name='ctl00$ContentPlaceHolder1$importWizard1$folderControl1$folderRepeater$ctl04$ImageButton" & myCounter & "'")
sb.Append(" id='ctl00_ContentPlaceHolder1_importWizard1_folderControl1_folderRepeater_ctl04_ImageButton" & myCounter & "'")
sb.Append(" src='images/folder.gif' style='border-width:0px;'  />" & vbCrLf)

私の質問は、サーバー上でコントロールを生成していることを考慮して、サーバー上で特定のメソッドを起動する「onCommand」イベントを追加するにはどうすればよいですか?ページをリロードするだけではありません。この機能は、更新パネルにあるユーザーコントロール(ascxファイル)にあります。ページ全体ではなく、更新パネルにポストバックするだけです。ONCommandイベントを使用して画像ボタンまたは任意のボタンのソースを表示すると、実際にはコードビハインドでも表示されません。

どんな助けでも素晴らしいでしょう。ああ、私はVisualStudio2005で開発しています

ありがとうジェイソン

このようなサーバーコントロールを追加しようとすると、次のようになります。

Dim img As New ImageButton
img.Command = New CommandEventHandler(AddressOf Button1_Click)

img.ID = "button-" & item.directoryName & "-" & item.objectValue
Dim newSb As StringBuilder = New StringBuilder()
Dim tw As StringWriter = New StringWriter(newSb)
Dim hw As HtmlTextWriter = New HtmlTextWriter(tw)
img.RenderControl(hw)

「img.Command」は、「パブリックイベントコマンド(オブジェクトとしての送信者、webcontrols.commandEventArgsとしてのe)はイベントであり、直接呼び出すことはできません。イベントを発生させるには、raiseeventステートメントを使用してください」というエラー(青い波線)を表示します。

Dim img As New ImageButton()
img.ID = "button-" & item.directoryName & "-" & item.objectValue
img.ImageUrl = "images/folder.gif"
AddHandler img.Click, AddressOf img_Click

Dim newSb As StringBuilder = New StringBuilder()
Dim tw As StringWriter = New StringWriter(newSb)
Dim hw As HtmlTextWriter = New HtmlTextWriter(tw)

img.RenderControl(hw)
sb.Append(tw.ToString)

Protected Sub img_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs)
    ...
End Sub

これはうまくレンダリングされているように見えますが(ソースを表示すると)、メソッドが実際に呼び出されることはありません。

4

2 に答える 2

0

だから、私はそれを理解し、他の誰かがこれをやろうとしている場合に備えて投稿したかった:

  1. クライアント側で、次の JavaScript 関数を追加します。

     function UpdPanelUpdate(value){   
     var obj = document.getElementById("<%= text.ClientID %>");   
     obj.value=value;  
      __doPostBack("ctl00$ContentPlaceHolder1$importWizard1$folderControl1$button","");
     }
    
  2. クライアント側で、次のコントロールを追加します。

      <asp:TextBox ID="text" runat="server" style="display:none;"></asp:TextBox>
      <asp:Button ID="button" runat="server" OnClick="Button1_Click" CommandArgument="" style="display:none;"/>
    
  3. クライアント ページで、トリガーを含むこの updatedate パネルを追加します。

    <asp:UpdatePanel ID="UpdatePanel1" runat="server"  UpdateMode="Conditional">
    <ContentTemplate>
        <div runat="server" id="theContainer" style="position:relative; border:1px solid grey; width:51em; height:28.8em; overflow:auto; align:left;"> 
            <asp:TextBox  runat="server" ID="currentIdTb" Visible="false"></asp:TextBox>     
        </div>
    </ContentTemplate>
    <Triggers>
      <asp:AsyncPostBackTrigger ControlID="button" EventName="Click" />
      </Triggers>
     </asp:UpdatePanel>
    
  4. コードビハインドで、次のハンドラーを追加します。

     Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
      'code here
     end sub
    
  5. 最後に、分離コードで、js 関数を呼び出す onclick を追加します。

       sb.Append("<input type='image' name='b" & myCounter & "'")
            sb.Append(" id='b" & myCounter & "'")
            sb.Append(" src='images/folder.gif' style='border-width:0px;' ")
            sb.Append(" onClick=""UpdPanelUpdate('" & item.objectValue & "')""  />" &   vbCrLf)
    
于 2012-07-26T17:41:11.227 に答える
0

あなたがやっているようにこれを行うことはおそらく可能ですが、私はお勧めしません。重要なのは、HTML コントロールとサーバー コントロールの違いを理解することです。

イベントを追加するには、サーバー コントロールを構築してから div に追加する必要があります。このようなものです (これは VB ではなく C# ですが、アイデアは得られます)。

Table table = new Table();
TableRow row = new TableRow();
TableCell cell = new TableCell();

ImageButton img = new ImageButton();
img.Command += new CommandEventHandler(img_Command);

cell.Controls.Add(img);
row.Controls.Add(cell);
table.Controls.Add(row);

myDiv.Controls.Add(table);

編集

あなたのコメントによると、VB では C# とは異なるハンドラーを登録することが問題だと思います。 .aspx) したがって、このようなものが必要です

AddHandler img.Command, AddressOf Button1_Click
于 2012-07-26T12:46:30.883 に答える