生成ASP.NET控件代码隐藏

时间:2011-04-15 15:59:45

标签: asp.net gridview

在gridview中,我有一个用于图像的列,使用模板:

<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中?感谢

3 个答案:

答案 0 :(得分: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。这使得OnClick分配不必要,因为您将在OnRowCommand事件中处理这两个属性。虽然CommandArgument的属性仍然可以在OnClick中使用,但是有意义。

我发现在尝试决定使用哪个控件时更容易使用它们并且如果我不需要我则关闭一个“关闭”。这不是非常有效,因为它在渲染之前仍然会经历计算过程,但这通常可以忽略不计,并且它永远不会出现在HTML中。

答案 1 :(得分: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,否则会显示简单的按钮。

答案 2 :(得分: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