我的用户控件遇到了一个非常奇怪的问题,我正在使用它。我正在编写一些用于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个小时来解决这个问题。