2012-07-26 118 views
0

我創建的插件Web控件的代碼生成的HTML的背後,是這樣的:添加事件來控制動態

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」給我一個錯誤(藍squigley行)說:「公共事件命令(發件人爲對象,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 

雖然這看起來很好(當我查看源代碼時)該方法從來沒有實際調用過。

回答

0

所以,我理解了它,並希望在情況後別人正在努力做到這一點:

  1. 在客戶端上,加此javascript函數:

    function UpdPanelUpdate(value){ 
    var obj = document.getElementById("<%= text.ClientID %>"); 
    obj.value=value; 
        __doPostBack("ctl00$ContentPlaceHolder1$importWizard1$folderControl1$button",""); 
    } 
    
  2. 在客戶端中添加這些控件:

    在代碼隱藏

    <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> 
    
  3. ,添加此處理程序:

  4. 在客戶端頁面,添加此updatedate面板觸發

    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) 
    
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 0.80)。ASPX),因此這樣的事情是你所需要的

AddHandler img.Command, AddressOf Button1_Click 
+0

感謝您的回覆。我試過創建一個服務器控件,但我沒有選擇添加「.Command」。 Intelisense只有.CommandName(一個字符串)和.commandArguement。如果它有所作爲,即時通訊使用visual studio 2005 – jason 2012-07-26 13:34:33

+0

ImageButton從.NET 1.1開始就有一個Command事件(請參閱http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.imagebutton。命令(v = vs.71).aspx) - 你確定你正在創建一個ImageButton而不是一個圖像?你可以發佈你已經嘗試過嗎? – 2012-07-26 13:41:34

+0

生病追加我原來的問題 – jason 2012-07-26 14:01:02