Классическое событие удаления ASP.NET не вызывается в динамически сгенерированной ссылке на удаление элемента управления сеткой данных
У меня есть классическое приложение asp.net. У меня есть пользовательский элемент управления сеткой данных с источником данных MarkUp как:
<asp:SqlDataSource ID="DataSource" runat="server" DeleteCommand="UPDATE tblLSystem SET LS_Deleted='1' WHERE LS_ID=@LS_ID"
SelectCommand="SELECT * FROM vwLSystem WHERE LS_Deleted='0' order by LS_CreatedOn" OnSelected="DataSource_Selected" OnDeleted="DataSource_Selected" OnDeleting = "DataSource_Deleting">
<DeleteParameters>
<asp:Parameter Name="LS_ID" Type="Object" />
</DeleteParameters>
</asp:SqlDataSource>
Шаблон кнопки удаления ссылки объявлен как:
<asp:TemplateField HeaderText="" SortExpression="" Visible="True">
<ItemTemplate>
<asp:LinkButton ID="btnDelete" CommandName="Delete" runat="server" Text="Delete" />
</ItemTemplate>
</asp:TemplateField>
Код, стоящий за именем класса "class StudLSystemGrid". И функция события DataSource_Deleting в этом классе:
protected void DataSource_Deleting(object sender, SqlDataSourceCommandEventArgs e)
{
}
Этот пользовательский элемент управления используется на другой странице asp.net. Он зарегистрирован на странице как:
<%@ Register Src="Controls/LSystemGrid.ascx" TagName="LSystemGrid" TagPrefix="uc4" %>
На той же странице он используется для статического создания одного пользовательского элемента управления следующим образом:
<uc4:LSystemGrid ID="LSystemGrid1" runat="server" ShowAuditFields="false" />
Мне также нужно создать несколько пользовательских элементов управления в зависимости от ситуации динамически в коде позади. Итак, у меня есть заполнитель на странице MarkUp:
<asp:PlaceHolder id="PlaceHolder1" runat="server"/>
И те же коды в коде позади, чтобы сгенерировать пользовательский элемент управления:
ucLControl =
LoadControl("Controls/LSystemGrid.ascx")
as StudLSystemGrid;
ucLControl.ID = "LSystemGridPD" + i.ToString();
ucLControl.ShowAuditFields = false;
ucLControl.SqlDataSource.ConnectionString = ConnectionManager.ConnectionString;
ucLControl.DataBind();
PlaceHolder1.Controls.Add(ucLControl);
Статически сгенерированный пользовательский элемент управления работает нормально. Нажатие на ссылку удаления может вызвать функцию "DataSource_Deleting", упомянутую ранее. Однако динамически генерируемый пользовательский элемент управления не работает. Функция "DataSource_Deleting" не нажата и элемент не может быть удален.
Источник HTML для ссылки удаления в пользовательском элементе управления со статической разметкой:
<a onclick="{alert('There'); return false;} ;"
id="ctl00_PageBody_LSystemGrid1_BaseGrid_ctl02_btnDelete"
href="javascript:__doPostBack('ctl00$PageBody$LSystemGrid1$BaseGrid$ctl02$btnDelete','')">Delete</a>
Для динамически генерируемого пользовательского элемента управления из кода сзади:
<a onclick="{alert('Here'); return false;} ;"
id="LSystemGridPD0_BaseGrid_ctl13_btnDelete"
href="javascript:__doPostBack('LSystemGridPD0$BaseGrid$ctl13$btnDelete','')">Delete</a>
Кто-нибудь знает, что здесь не так? Как мы можем определить, что сетка данных находится в режиме удаления при использовании кнопки удаления ссылки таким образом в коде позади?
Спасибо
Обновление: пользовательский элемент управления динамически генерируется из -
protected void Page_Load(object sender, EventArgs e)
{
PreRender += LSystem_PreRender;
}
void LSystem_PreRender(object sender, EventArgs e)
{
ucLControl =
LoadControl("Controls/LSystemGrid.ascx")
as StudLSystemGrid;
ucLControl.ID = "LSystemGridPD0";
ucLControl.ShowAuditFields = false;
ucLControl.SqlDataSource.ConnectionString = ConnectionManager.ConnectionString;
ucLControl.DataBind();
PlaceHolder1.Controls.Add(ucLControl);
}
Обновление 2:
Обновление 2: пользовательский элемент управления динамически генерируется из -
protected void Page_Load(object sender, EventArgs e)
{
ucLControl =
LoadControl("Controls/LSystemGrid.ascx")
as StudLSystemGrid;
ucLControl.ID = "LSystemGridPD0";
ucLControl.ShowAuditFields = false;
ucLControl.SqlDataSource.ConnectionString = ConnectionManager.ConnectionString;
ucLControl.EnableViewState = true;
ucLControl.DataBind();
PlaceHolder1.Controls.Add(ucLControl);
}
1 ответ
Обнаружил проблему. Данные были связаны после
ucLControl = LoadControl("Controls/LSystemGrid.ascx") as StudLSystemGrid;
Вызов ucLControl.DataBind(); снова стирает ограниченные атрибуты.
После удаления строки "ucLControl.DataBind();" может быть инициировано событие удаления.