我正在使用的用户控件有一个非常奇怪的问题。我正在编写一些要在 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?
这让我想到,如果 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 个小时来解决这个问题。