2014-01-26 5 views
1

У меня есть контроль, унаследованный от UserControl. Этот элемент управления имеет LinkButton на нем с LbButtonClick(object sender, EventArgs e). У меня есть только файл ascx для этого элемента управления и предварительно скомпилированная сборка.Как переопределить метод UserControl в ascx-файле без источника?

Мне нужно заменить метод LbButtonClick с помощью моего собственного метода. Как это сделать? Могу ли я сделать это в файле ascx или мне нужно изменить элемент управления, когда он впервые загружен на веб-странице.

Я хотел бы использовать первое решение, если это возможно (файл ascx) - чтобы моя модификация была как можно ближе к самому элементу управления.

Edited

Я хотел бы поблагодарить @pid и @Francesco Милани за их помощь. Я рассматривал их решения, но перед их внедрением я просто попробовал еще одну вещь. Просто я добавил этот код в файл ascx упомянутого элемента управления.

<script runat="server" type="text/C#"> 
    protected void LbButtonClick(object sender, EventArgs e) 
    { 
     //Some code here... 
    } 
</script> 

И это сработало. Кажется, что метод переопределения в ascx-файле разрешен, и этот переопределенный метод вызывается вместо того, который был предварительно скомпилирован в сборке. Я не получил информации от компилятора, никаких предупреждений и намеков. Как ни странно, я не понимаю. Поскольку это проще и чище, чем предлагаемые решения, я бы принял это как ответ, но я не люблю принимать свои собственные ответы.

Возможно, кто-то может объяснить мне, почему работа над конструкцией работала?

ответ

0

Никогда не пробовал это, но вы должны быть способны извлечь из класса, а затем использовать его в форме. Если класс запечатан ... нет кубиков!

Другой способ заключается в том, чтобы обернуть ASCX самостоятельно, удалить кнопку из исходного ASCX (путем редактирования его HTML), а затем добавить кнопку самостоятельно. Когда ваша собственная кнопка будет нажата, запустите событие щелчка внутреннего ASCX «вручную»: LbButtonClick(mySender, myArgs).

Мне любопытно, как это получается. Дайте нам знать, как вы это решаете, пожалуйста!

+0

Здравствуйте, как вы просили, я сообщаю в своем отредактированном ответе, как я решил проблему. :) Извините за поздний ответ, у меня не было времени написать это раньше. – Wodzu

+0

Ваш собственный ответ на самом деле очень интересный. +1 для обмена! – pid

0

Посмотрите на это.

testControl.acx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="testControl.ascx.cs" Inherits="TestWebApp.testControl" %> 
<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton> 

и отделенного кода:

protected void Page_Load(object sender, EventArgs e) 
{ 
    this.LinkButton1.Click += LinkButton1_Click; 
} 

private void LinkButton1_Click(object sender, EventArgs e) 
{ 
    Response.Redirect("http://www.google.com"); 
} 

В вашем примере вы не имеете доступа к методу LinkButton1_Click .. так

default.aspx

<%@ Register Src="~/testControl.ascx" TagPrefix="uc1" TagName="testControl" %> 


<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <uc1:testControl runat="server" id="testControl" /> 
    </div> 
    </form> 
</body> 
</html> 

и отделенный код:

protected void Page_Load(object sender, EventArgs e) 
    { 
     foreach (LinkButton lb in testControl.Controls) 
     { 
      if (lb.ID == "LinkButton1") 
      lb.Click += lb_Click; 
     } 
    } 

    private void lb_Click(object sender, EventArgs e) 
    { 
     Response.Redirect("http://www.microsoft.com"); 
    } 

Таким образом, вы будете переадресованы на Microsoft, а не Google. Надеюсь, это поможет