Классическое событие удаления 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();" может быть инициировано событие удаления.

Другие вопросы по тегам