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 事件查看图像按钮或任何按钮的源时,它实际上甚至不在后面的代码中。

任何帮助都会很棒。哦,我正在使用 Visual Studio 2005 进行开发

谢谢杰森

如果我尝试添加这样的服务器控件:

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”给我一个错误(蓝色波浪线)说“公共事件命令(发送者作为对象,e 作为 webcontrols.commandEventArgs)是一个事件,不能直接调用。使用引发事件语句来引发事件”

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

他们可能会按照您的方式执行此操作,但我不建议您这样做。关键是了解 HTML 控件和服务器控件之间的区别。

要添加事件,您需要建立服务器控件,然后将它们添加到您的 div - 像这样(这是 C# 而不是 VB,但您明白了)

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# 中不同 - 您需要查看 AddHandler (http://msdn.microsoft.com/en-us/library/6yyk8z93(v=vs.80) ).aspx) 所以你需要这样的东西

AddHandler img.Command, AddressOf Button1_Click
于 2012-07-26T12:46:30.883 回答
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. 在客户端页面上,添加带有触发器的更新面板:

    <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. 最后,在代码隐藏中,添加一个 onclick 甚至调用 js 函数。

       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 回答