【问题标题】:How to implement a C# custom server control?如何实现 C# 自定义服务器控件?
【发布时间】:2009-12-03 14:37:05
【问题描述】:

我正在尝试使用this Stack Overflow post 上提供的RowClickableGridView 类来实现自定义控件。这是我第一次尝试创建自定义服务器控件并遵循this MSDN walkthrough 中列出的步骤。

我的 Web 应用程序项目的 App\_Code 目录中有 RowClickableGridView 类,命名空间为 MyWebApplication.App\_Code,它可以编译。

我的问题是我尝试使用控件的.aspx 页面无法识别标签前缀。该页面还针对cc1:GridViewRowClickable 标记之间的不受支持元素发出大量警告。根据 MSDN 演练,我以为我已经准备就绪。

代码片段

<%@ Page Title="MyPage" Language="C#" MasterPageFile="~/MyMaster.master" AutoEventWireup="true" Inherits="MyPage" Codebehind="MyPage.aspx.cs" %>
<%@ Register TagPrefix="cc1" TagName="RowClickableGridView" Namespace="MyWebApplication.App_Code" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyConnectionString %>" SelectCommand="MySpName" SelectCommandType="StoredProcedure">
    </asp:SqlDataSource>
    <cc1:RowClickableGridView ID="GVW_test" runat="server" DataSourceID="SqlDataSource1">
        <HeaderStyle CssClass="ListTop" />
        <RowStyle CssClass="RowHighlight" />
        <Columns>
            <asp:BoundField HeaderText="ID" DataField="Atr_ID" SortExpression="Atr_ID" />
            <asp:BoundField HeaderText="Name" DataField="Atr_Name" SortExpression="Atr_Name" />
        </Columns>
        <EmptyDataTemplate>
            No Data
        </EmptyDataTemplate>
   </cc1:RowClickableGridView>
</asp:Content>

关于我做错了什么的任何想法或关于下一步尝试的建议?

【问题讨论】:

    标签: c# .net asp.net user-controls ascx


    【解决方案1】:

    您已将“RowClickableGridView”指定为 TagName,但您在代码中使用“GridViewRowClickable”。

    【讨论】:

    • +1 用于指出有问题的错误输入。不幸的是,我的标记名和使用的标记是相同的名称,所以这并没有解决我的错误。我刚刚将类名更改为 GridViewRowClickable,因为我喜欢将 GridView 放在名称的首位。我已编辑问题以显示正确的名称。
    【解决方案2】:

    我终于让它工作了。不过我采取了不同的方法。

    1. 创建一个新的 ASP.NET 服务器控制项目
    2. 将类复制到默认cs文件并重命名命名空间。
    3. 将默认 TagPrefix 添加到命名空间声明上方的行。
      [assembly: TagPrefix("mynamespace", "mycustomtag")]
    4. 将 ToolBoxData 添加到复制的类上方的行。
      [ToolboxData("&lt;{0}:GridViewRowClickable runat=server&gt;&lt;/{0}:GridViewRowClickable&gt;")]
    5. 将项目构建到 dll 中
    6. 复制dll到Web应用的bin目录
    7. Web 应用程序项目中的引用 dll
    8. 通过添加从 dll 创建新的工具箱项来将控件添加到工具箱
    9. 将控件从工具箱拖放到 aspx 页面中

    这会在 aspx 页面的顶部添加适当的 Register 指令并修复我收到的所有警告。自动完成也适用于这种情况。

    下面是代码。

    <%@ Page Title="" Language="C#" MasterPageFile="~/MyMaster.master" AutoEventWireup="true" Inherits="MyPage" Codebehind="MyPage.aspx.cs" %>
    <%@ Register Assembly="GridViewRowClickable" Namespace="CustomServerControls" TagPrefix="MyTag" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
        <asp:SqlDataSource ID="Sql_MyTable" runat="server" ConnectionString="<%$ ConnectionStrings:MyConnectionString %>"
            SelectCommand="spTbl_Select" SelectCommandType="StoredProcedure">
        </asp:SqlDataSource>
        <egcc:GridViewRowClickable ID="GridViewRowClickable_test" runat="server" 
            DataSourceID="Sql_MyTable" DataKeyNames="tbl_id"
            AllowSorting="True" AutoGenerateColumns="False" GridLines="None" PageSize="25" Width="100%"
            EnableRowClickSelection="true" RowClickCommand="Select" OnSelectedIndexChanged="GridViewRowClickable_test_OnSelectedIndexChanged">
            <Columns>
                <asp:BoundField HeaderText="ID" DataField="tbl_id" SortExpression="tbl_id" />
                <asp:BoundField HeaderText="Name" DataField="tbl_name" SortExpression="tbl_name" />
            </Columns>
            <EmptyDataTemplate>
                No Data.
            </EmptyDataTemplate>
        </egcc:GridViewRowClickable>
    </asp:Content>
    

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多