2008-10-22 6 views
1

У меня есть CompositeControl, который содержит DropDownList.Как я могу получить UpdatePanel для перехвата DropDownList CompositeControl

Я установил свойство AutoPostBack для DropDownList равным true.

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

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

Я также попытался установить ChildrenAsTriggers = "истинный" и UpdateMode = "Всегда" но и не решили проблему.

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

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

Спасибо!

Edit - Запрашиваемая информация

Страна и государства являются DropDownLists в CompositeControl.

country.SelectedIndexChanged += new EventHandler(country_SelectedIndexChanged); 

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

У вас есть другие обновления на странице или внутри вашего контроля? Кроме того, вы можете показать код для обработчика события DropDownList SelectedIndexChanged и определения делегата. – Kon 2008-10-22 13:23:47

+0

Нет, у меня нет никаких других UpdatePanels на странице или в элементе управления. Я отредактирую свое сообщение, чтобы показать обработчик. – 2008-10-22 13:55:55

ответ

3

Ok так что это не может быть лучшим ответом, но я думаю, что проблема вы имея его, что 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; 
} 

Где label - это упомянутая выше этикетка. И тогда пусть волшебство произойдет.

Также две ноты:

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

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

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

+0

Я добавил обработчик для конструктора для моего CompositeControl, но в hanlder SelectedIndexChanged alway == null, поэтому он никогда не запускается. – 2008-10-22 14:41:38

0

Я сделал следующее в конце 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>); 
0

Просто убедитесь, что все управление в целом иерархии имеет идентификатор набора.

См. this question.

2

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^