C # Динамически созданный обработчик события команды LinkButton - PullRequest
3 голосов
/ 26 сентября 2008

Итак, у меня странная ситуация ... У меня есть класс System.Web.UI.WebControls.WebParts.EditorPart. Он отображает кнопку «Поиск», когда вы нажимаете эту кнопку, его метод clickHandler выполняет поиск в БД и динамически создает LinkButton для каждой возвращаемой строки, устанавливает свойства CommandName и CommandArgument и добавляет метод CommandEventHandler, а затем добавляет элемент управления LinkButton. на страницу.

Проблема в том, что когда вы нажимаете LinkButton, его метод CommandEventHandler никогда не вызывается, похоже, что страница просто отправляет туда, где она была до того, как была нажата ОРИГИНАЛЬНАЯ кнопка «Поиск».

Я видел сообщения о том, что вам нужно добавить обработчики событий в OnLoad () или некотором другом раннем методе, но мои LinkButtons даже не были созданы, пока пользователь не скажет нам, что искать, и не нажмет "Поиск" Кнопка ... Есть идеи, как с этим бороться?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 14 октября 2008

Это мой любимый трюк:)

Наш сценарий - сначала сделать элемент управления. Затем, используя некоторые входные данные от пользователя, визуализируйте дополнительные элементы управления и заставьте их реагировать на события.

Ключевым моментом здесь является состояние - вам нужно знать состояние элемента управления, когда он поступает в PostBack, поэтому мы используем ViewState. Проблема становится тогда проблемой курицы и яйца; ViewState доступен только после вызова LoadViewState(), но вы должны создать элементы управления до этого вызова, чтобы события запускались правильно.

Хитрость в том, чтобы переопределить LoadViewState() и SaveViewState(), чтобы мы могли контролировать вещи.

(обратите внимание, что приведенный ниже код является грубым, из памяти и, вероятно, имеет проблемы)

private string searchQuery = null;

private void SearchButton(object sender, EventArgs e)
{
    searchQuery = searchBox.Text;
    var results = DataLayer.PerformSearch(searchQuery);
    CreateLinkButtonControls(results);
}

// We save both the base state object, plus our query string.  Everything here must be serializable.
protected override object SaveViewState()
{
    object baseState = base.SaveViewState();
    return new object[] { baseState, searchQuery };
}

// The parameter to this method is the exact object we returned from SaveViewState().
protected override void LoadViewState(object savedState)
{
    object[] stateArray = (object[])savedState;

    searchQuery = stateArray[1] as string;

    // Re-run the query
    var results = DataLayer.PerformSearch(searchQuery);

    // Re-create the exact same control tree as at the point of SaveViewState above.  It must be the same otherwise things will break.
    CreateLinkButtonControls(results);

    // Very important - load the rest of the ViewState, including our controls above.
    base.LoadViewState(stateArray[0]);
}
1 голос
/ 26 сентября 2008

Вам необходимо повторно добавить динамически созданные элементы управления в onload, чтобы они могли находиться в иерархии страниц и запускать свое событие.

0 голосов
/ 11 января 2017
 LinkButton link= new LinkButton();
 link.Command +=new CommandEventHandler(LinkButton1_Command);

 protected void LinkButton1_Command(object sender, CommandEventArgs e)
{
    try
    {
        System.Threading.Thread.Sleep(300);
        if (e.CommandName == "link")
        {
           //////////
        }
    }
    catch
    {

    }
}
0 голосов
/ 01 апреля 2010

Грязный хак, который я только что придумал, - это создание фиктивных кнопок LinkButton с теми же идентификаторами, что и у настоящих кнопок. Допустим, вы собираетесь создать LinkButton «foo» в Pre_Render (что слишком поздно), а затем также создать фиктивный foo в Page_Load:

        var link = new LinkButton();
        link.ID = "foo";
        link.Click += fooEventHandler;
        dummyButtons.Controls.Add(link);

(где "dummyButtons" - это просто PlaceHolder на странице с Visibility, установленной в false.) Это некрасиво, но работает.

...