【问题标题】:Generating ASP.NET Controls code-behind生成 ASP.NET 控件代码隐藏
【发布时间】:2011-04-15 15:59:44
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    我会这样做:

    <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 中使用并且是有意义的。

    我发现在尝试决定使用哪个控件来同时使用它们并在不需要 i 时将其中一个“关闭”更容易。这不是非常有效,因为它仍然要经过计算过程直到渲染,但这通常可以忽略不计,它永远不会出现在 html 中。

    【讨论】:

    • 这可能会解决我的问题。非常感谢。
    【解决方案2】:

    如果控件要在 EditItemTemplate 或 ItemTemplate 中,则不需要动态生成 then。静态放置它们,根据行是处于编辑模式还是项目模式,将显示正确的控件。

    <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>
    

    以上代码将在编辑模式下显示文件上传,否则显示简单按钮。

    【讨论】:

      【解决方案3】:

      首先,这就是为什么您看不到它们的原因:网络浏览器不知道如何处理 &lt;asp:FileUpload&gt; 标记。如果你直接把它放在你的 ASPX 中并运行它,你会注意到在实际的 html 源代码中,浏览器将它视为&lt;input type="file"&gt;。所有 .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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        • 2011-01-27
        相关资源
        最近更新 更多