2011-04-15 107 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