我正在通过在后面的代码中添加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文件)中。我只是希望更新pannel回发,而不是整个页面。当我使用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”给我一个错误(蓝色squigley行),说“公共事件命令(发件人作为对象,e作为webcontrols.commandEventArgs)是一个事件,不能直接调用。使用raise事件语句来提高事件“
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
虽然这似乎很好(当我查看源代码时),但实际上从未调用该方法。
答案 0 :(得分: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
答案 1 :(得分:0)
所以,我想出来并想发布以防其他人试图这样做:
在客户端,添加此javascript函数:
function UpdPanelUpdate(value){
var obj = document.getElementById("<%= text.ClientID %>");
obj.value=value;
__doPostBack("ctl00$ContentPlaceHolder1$importWizard1$folderControl1$button","");
}
在客户端,添加以下控件:
<asp:TextBox ID="text" runat="server" style="display:none;"></asp:TextBox>
<asp:Button ID="button" runat="server" OnClick="Button1_Click" CommandArgument="" style="display:none;"/>
在客户端页面上,使用触发器添加此更新面板:
<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>
,添加此处理程序:
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
'code here
end sub
最后,在代码隐藏中,添加一个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)