2011-04-15 102 views
2

在GridView,我有我使用的圖像列,使用模板:生成ASP.NET控件代碼隱藏

<asp:TemplateField HeaderText="Image">   

       <EditItemTemplate> 
       <%#GenerateControl(Eval("id").toString) %> 
       </EditItemTemplate> 

       <ItemTemplate> 
        <%#GetImageById(Eval("id"))%> 
       </ItemTemplate> 
      </asp:TemplateField> 

我想產生一個控制,這取決於羯羊圖像存在與否。我在後面的代碼中使用的代碼是:

Protected Function GenerateControl(ByVal id As String) As String 
     Dim scrString As String = "../../Assets/Zalen/" + id + ".jpg" 
     Dim strImageUrl As String = Me.Server.MapPath(scrString) 
     If Not File.Exists(strImageUrl) Then 
     Return "<asp:FileUpload ID=""FileUpload1"" runat=""server"" />" 
     Else 
     Return "<asp:button ID=""Button1"" runat=""server"" Text=""Verwijder afbeelding"" OnClick=""DeleteImage(" + id + ")""/>" 
     End If 
    End Function 

這是由GridView.Updating事件調用的方法。

因此,基本上:如果圖像存在,我想顯示一個按鈕,以便用戶能夠刪除圖像。如果圖像還不存在(圖像基於表的主鍵(「id」)),那麼我想顯示一個FileUpload控件。

當我運行網站時,控件顯示在HTML代碼中,但它們不顯示在網站上。 (即:通過代碼可見,而不是直觀)

如何正確地將控件動態地呈現到GridView中?謝謝

回答

2

這是我會怎麼做:

<asp:TemplateField HeaderText="Image">   
    <EditItemTemplate> 
     <asp:FileUpload ID="FileUpload1" runat="server" Visible='<%#GenerateControl(Eval("id").ToString()) %>' /> 
     <asp:button ID="Button1" runat="server" Text="Verwijder afbeelding" CommandArgument='<%#Eval("id").ToString() %>' CommandName="DeleteImage" Visible='<%#GenerateControl(Eval("id").ToString()) %>' OnClick="DeleteImage" /> 
    </EditItemTemplate> 

    <ItemTemplate> 
     <%#GetImageById(Eval("id"))%> 
    </ItemTemplate> 
</asp:TemplateField> 

然後在後面的代碼:

Protected Function GenerateControl(ByVal id As String) As Boolean 
     Dim scrString As String = "../../Assets/Zalen/" + id + ".jpg" 
     Dim strImageUrl As String = Me.Server.MapPath(scrString) 
     Return File.Exists(strImageUrl) 
End Function 

注:我假設你正在使用後面方法的代碼執行刪除操作,所以我選擇了包括CommandArgument和CommandName的。由於您將在OnRowCommand事件中處理這兩個屬性,因此這使得OnClick分配不再必要。雖然CommandArgument的屬性仍然可以在OnClick中使用,並且會很有意義。

我發現當試圖決定使用哪一種控件時只是爲了使用它們,如果我不需要我就關閉一個控件。這不是非常有效,因爲它直到渲染仍然經歷計算過程,但這通常可以忽略不計,並且它永遠不會出現在html中。

+0

這可能會解決我的問題。非常感謝你。 – Matthias 2011-04-15 16:41:18

0

如果控件位於EditItemTemplate或ItemTemplate中,則不需要動態生成。靜態放置它們並根據行是處於編輯模式還是項目模式,顯示正確的控件。

<asp:TemplateField HeaderText="Image">   
    <EditItemTemplate> 
     <asp:FileUpload ID="FileUpload1" runat="server" /> 
    </EditItemTemplate> 

    <ItemTemplate> 
     <asp:button ID="Button1" runat="server" Text="Verwijder afbeelding"/> 
    </ItemTemplate> 
</asp:TemplateField> 

上面的代碼會在編輯模式下顯示fileupload,否則顯示簡單的按鈕。

0

首先,這裏是爲什麼你沒有直觀地看到它們:網絡瀏覽器不知道如何處理<asp:FileUpload>標籤。如果你直接把它放到你的ASPX中,並運行它,你會注意到,在實際的html源代碼中,瀏覽器將它視爲<input type="file">。所有的.NET服務器控件都以這種方式工作 - 他們將HTML發送到瀏覽器。 (在這裏看到:http://support.microsoft.com/kb/306459

無論如何,有這裏正確的文章添加控件的代碼隱藏:http://www.c-sharpcorner.com/UploadFile/sd_patel/DynamicallyCreateASPNETControls11232005020626AM/DynamicallyCreateASPNETControls.aspx

更新

這是一個比一個更簡單的文章我掛到上面:http://learning2code.net/Learn/2009/8/12/Adding-Controls-to-an-ASPNET-form-Dynamically.aspx