GridView行事件未在UserControl中触发

时间:2012-04-04 18:27:53

标签: c# gridview user-controls ascx commandfield

我的用户控件遇到了一个非常奇怪的问题,我正在使用它。我正在编写一些用于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中选择某些东西时,我正在清除Placeholder中的控件,并为他们选择的任何类型的记录集重新添加一个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事件在我第二次点击之前不会触发。

知道为什么会这样吗?

UPDATE :我已经设法找出我的SelectedIndexChanged处理程序在将UserControl读取到PlaceHolder时有效地重置了UserControl所包含的网格上的DataSource。单击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个小时来解决这个问题。

0 个答案:

没有答案