2

我正在使用的用户控件有一个非常奇怪的问题。我正在编写一些要在 DotNetNuke 模块中使用的用户控件。

基本上我的页面上有一个包含一些控件的 UserControl,然后有一个占位符,我在其中加载了一个放置了 GridView 的 UserControl。

基本上这是我的页面结构

<asp:Panel runat="server" ID="pnlServiceType" Visible="false">
   <uc:ServiceType runat="server" ID="ServiceType" />
</asp:Panel>

在该用户控件中是一些表单元素,然后是以下内容:

<asp:PlaceHolder runat="server" ID="phServices" />

然后该占位符添加了一个用户控件,如下所示:

<p class="header"><asp:Label runat="server" ID="lblServiceHeader" Font-Bold="true" /></p>

<asp:GridView runat="server" ID="gvServices" AlternatingRowStyle-BackColor="#eaeaea"  BorderStyle="None" GridLines="None"
AutoGenerateColumns="false" CellPadding="6" Width="100%" EnableViewState="false" OnRowEditing="gvServices_RowEditing">

当用户在 DropDownList 中选择某些内容时,我正在清除占位符中的控件,并为他们选择的任何类型的记录集重新添加一个 UserControl

        _serviceID = e.Value;

        //Clear the controls out of the placeholder
        phServices.Controls.Clear();

        //Reset the count of grids for the OnInit() method
        Session["GridCount"] = 0;

        if (e.Value != "NULL")
        {
            PopulateServicesGrid(_service.GetServicesByFormType(Convert.ToInt32(e.Value)));
        }
        else
        {
            PopulateServicesGrid(_service.GetServicesByClient(Convert.ToInt32(_client)));
        }

和 PopulateServicesGrid 方法:

    private void PopulateServicesGrid(List<NOAService> services)
    {
        //Creates a LINQ grouping based on the Billing Codes
        //Allows a super easy creation of grids based on the grouped billing codes
        var query = services.Select(service => service.BillingCode).Distinct();
        foreach (string code in query)
        {
            var servicesByCode = services.Where(service => service.BillingCode == code).ToList();
            ServicesGrid servicesGrid = LoadControl("~/DesktopModules/LEL Modules/NOA/ServicesGrid.ascx") as ServicesGrid;
            Label lblServiceHeader = servicesGrid.FindControl("lblServiceHeader") as Label;
            GridView gvServices = servicesGrid.FindControl("gvServices") as GridView;

            phServices.Controls.Add(servicesGrid);
            servicesGrid.ID = code;
            lblServiceHeader.Text = servicesByCode[0].FormTypeName;
            gvServices.DataSource = servicesByCode;
            gvServices.DataBind();

            Session["GridCount"] = phServices.Controls.Count;

        }
    }

在我的 ServiceType UserControl 上,在 PageInit 上,我正在读取 ServiceGrid 用户控件,以便我的网格显示在回发中并且不会从占位符中丢失

    void NOAServiceType_Init(object sender, EventArgs e)
    {
        for (int i = 0; i < Convert.ToInt32(Session["GridCount"]); i++)
        {
            ServicesGrid servicesGrid = LoadControl("~/DesktopModules/LEL Modules/NOA/ServicesGrid.ascx") as ServicesGrid;
            phServices.Controls.Add(servicesGrid);

        }
    }

网格成功填充,一切似乎都运行良好。但由于某种原因,在我的 GridView 上,我有一个 CommandField

    <asp:CommandField ShowEditButton="true" ItemStyle-HorizontalAlign="Right" EditText="Edit" UpdateText="Update" 
        EditImageUrl="~/images/LELModules/appbar.edit.rest.png" CancelImageUrl="~/images/LELModules/appbar.close.rest.png" UpdateImageUrl="~/images/LELModules/appbar.check.rest.png"
        ButtonType="Image" CausesValidation="false" />

当我单击网格行上的编辑命令时,没有任何反应。我的网格没有丢失它的行,控件仍然存在,一切看起来应该没问题。在我第二次单击它之前,该RowEditing事件不会触发。

知道为什么会发生这种情况吗?

更新:我已经设法弄清楚当我的 SelectedIndexChanged 处理程序DataSource被读取到 PlaceHolder 时,我的 SelectedIndexChanged 处理程序正在有效地重置 UserControl 包含的网格。但是,当单击 CommandField(编辑)时,会Init触发保存占位符的 UserControl

ServiceType UserControl < `Init` fires here
   -Form elements
   -Placeholder which holds
      --UserControl with GridView

Init方法加载 UserControl 的新实例并将它们添加到 PlaceHolder,但 DataSource 是null. 看起来EnableViewState=true数据仍然是绑定的,但是如果我处理PreRender,我可以看到DataSource我的gvServices | null

是否甚至可以在 GridView 上编辑这样的行,这些行一次又一次地动态添加到 PlaceHolder?

已修复我在参考这篇文章 http://www.west-wind.com/weblog/posts/2006/Feb/24/Overriding-ClientID-and-UniqueID-on-ASPNET-controls后发现了问题所在

这让我想到,如果 ID 被更改了怎么办?控件是嵌套的。所以我去观察了 GridView 的 ID、ClientID 和 UniqueID,只是为了看看。当控件加载到我的Init处理程序上时,它会在添加时分配一个超级通用 ID。

private void PopulateServicesGrid(List<NOAService> services)
{
    //Creates a LINQ grouping based on the Billing Codes
    //Allows a super easy creation of grids based on the grouped billing codes
    var query = services.Select(service => service.BillingCode).Distinct();
    foreach (string code in query)
    {
        var servicesByCode = services.Where(service => service.BillingCode == code).ToList();
        ServicesGrid servicesGrid = LoadControl("~/DesktopModules/LEL Modules/NOA/ServicesGrid.ascx") as ServicesGrid;
        Label lblServiceHeader = servicesGrid.FindControl("lblServiceHeader") as Label;
        GridView gvServices = servicesGrid.FindControl("gvServices") as GridView;

        phServices.Controls.Add(servicesGrid);
        **servicesGrid.ID = code;**
        lblServiceHeader.Text = servicesByCode[0].FormTypeName;
        gvServices.DataSource = servicesByCode;
        gvServices.DataBind();

        Session["GridCount"] = phServices.Controls.Count;

    }
}

我正在将 ID 设置为其他内容。因此,当我在网格上点击 Edit RowCommand 时,它再次重新加载控件,Init并且 ID 从我的自定义设置代码(T2020,从我的数据库中提取)再次更改回通用 ID,它不知道如何触发事件。

我希望这对某人有所帮助,因为我已经失去了至少 12 个小时来解决这个问题。

4

0 回答 0