Как я могу получить UpdatePanel для перехвата DropDownList CompositeControl - PullRequest
1 голос
/ 22 октября 2008

У меня есть CompositeControl, который содержит DropDownList.

Я установил для свойства AutoPostBack DropDownList значение true.

На странице у меня есть:

<asp:UpdatePanel ID="UpdatePanel" runat="server">
    <ContentTemplate>
        <MyControl:Control ID="CustomControl" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

Я также пытался установить ChildrenAsTriggers = "true" и UpdateMode = "Always" , но ни одна из них не решила проблему.

Проблема заключается в том, что UpdatePanel не перехватывает сообщение DropDownList CompositeControl. (Полный POST выполняется при изменении DropDownList)

Как я могу получить UpdatePanel для обработки обратной передачи?

Спасибо!

Редактировать - Запрошенная информация

Страна и государства - оба DropDownLists в CompositeControl.

country.SelectedIndexChanged += new EventHandler(country_SelectedIndexChanged);

protected void country_SelectedIndexChanged(Object sender, EventArgs e)
{
    states.DataSource = XXX;
    states.DataBind();
}

Ответы [ 4 ]

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

Хорошо, так что это может быть не самый лучший ответ, но я думаю, что у вас проблема в том, что UpdatePanel просто не может видеть событие дочернего элемента управления. Хорошая новость в том, что это легко исправить. Скажем, у вас есть элемент управления (CatchMyEvent, который, кстати, является сумасшедшим умным именем) и на нем есть DropDownList. Теперь вы хотите, чтобы родительская страница увидела огонь события SelectedIndexChanged в этом списке и обновила метку в соответствии с SelectedItem.Text. На самом деле, родитель не может этого сделать. Итак, давайте изменим это:

public partial class CatchMyEvent : System.Web.UI.UserControl
{
    public delegate void ChangedIndex(object sender, EventArgs e);
    public event ChangedIndex SelectedIndexChanged;

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        dropDownListThrow.SelectedIndexChanged += new EventHandler(dropDownListThrow_SelectedIndexChanged);
        labelOutput.Text = "no";
    }

    public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
    {
        labelOutput.Text = ((DropDownList)sender).SelectedItem.Text;
        if(SelectedIndexChanged != null)
        {
            SelectedIndexChanged(sender, e);
        }
    }
}

По сути, все, что я сделал, - это чтобы элемент управления перехватил событие SelectedIndexChanged DropDownList и запустил его, чтобы любая родительская страница или элемент управления могли его видеть. По сути, все, что я сделал, это передал. Теперь на родительской странице это действительно легко сделать.

Вам просто нужно добавить UpdatePanel с триггером, который содержит:

<asp:AsyncPostBackTrigger ControlID="catchMyEventMain" EventName="SelectedIndexChanged" />

... и, конечно, добавьте это к коду для родительской страницы:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    catchMyEventMain.SelectedIndexChanged += dropDownListThrow_SelectedIndexChanged;
}

public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
{        
    labelSelectedValue.Text = ((DropDownList)sender).SelectedItem.Text;
}

Где метка является упомянутой ранее меткой. И тогда пусть случится магия.

Также две заметки:

1) Не будьте идиотом, каким я был при тестировании, и не забудьте установить для свойства AutoPostBack в DropDownList значение true.

2) Убедитесь, что метка находится в ContentTemplate элемента UpdatePanel.

Надеюсь, это поможет.

2 голосов
/ 29 августа 2013

У меня были повторяющиеся дочерние элементы управления (текстовое поле и метки) в ListView внутри UpdatePanel.

Изменение текстового поля приведет к полной (синхронизации) обратной передаче.

Я добавил элемент PAGE (первая строка на странице .aspx): ClientIDMode = "AutoID"

Это устранило проблему для меня, и теперь только UpdatePanel обновляется - по желанию.

0 голосов
/ 17 августа 2010

Просто убедитесь, что каждый элемент управления во всей вашей иерархии имеет установленный идентификатор.

См. этот вопрос .

0 голосов
/ 08 декабря 2008

Я сделал следующее в конце BuildControlHierarchy:

        ...
        if (DesignMode || Page == null) return;

        var sm = ScriptManager.GetCurrent(Page);
        if (sm == null)
        {
            throw new MissingFieldException("The ScriptManager is needed on the page!");
        }
        sm.RegisterAsyncPostBackControl(<control which initiates async postback>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...