2010-09-13 2 views
5

я иметь следующую структуруКак изменить вид с помощью кнопки на ретрансляторе?

<asp:UpdatePanel ID="MyUpdatePanel" runat="server"> 
    <ContentTemplate> 
     <asp:MultiView ID="MyViews" runat="server"> 
      <asp:View ID="List" runat="server"> 
       <asp:Repeater runat="server" ID="Repeater1"> 
        <ItemTemplate> 
         <asp:LinkButton ID="Button1" runat="server" Text="Button1" CommandName="View" /> 
        </ItemTemplate> 
       </asp:Repeater> 
      </asp:View> 
      <asp:View ID="Single" runat="server"> 
       <asp:LinkButton ID="Button2" runat="server" Text="Button2" /> 
      </asp:View> 
     </asp:MultiView> 
    </ContentTemplate> 
</asp:UpdatePanel> 

на коде позади я получаю событие повторителя ItemDataBound, получить контроль с помощью var button1 = e.Item.FindControl("Button1") as LinkButton; тогда я назначить CommandArgument с ID текущего элемента.

Это выполняется сразу после метода CreateChildControls.

Repeater1.ItemDataBound += (s, e) => 
{ 
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
    { 
     var Button1 = e.Item.FindControl("Button1") as LinkButton; 
     Button1.CommandArgument = item.ID.ToString(); 
    } 
}; 

Repeater1.ItemCommand += (s, e) => 
{ 
    if (e.CommandName == "View") 
    { 
     var item = provider.Get(Convert.ToInt64(e.CommandArgument)); 
     BuildSingleView(item); 
    } 
}; 

Этот метод просто изменить вид ...

public void BuildSingleView(var item) 
{ 
    MyViews.ActiveViewIndex = 1; 
    /* Edit 
     I've tried to call here 
     Initialize(), EnsureChildControls(), CreateChildControls() 
     but it was a useless try. I also tried to catch exceptions, 
     but none happened. 
    */ 
} 

Проблема заключается в том, что вид не меняется. Когда я нажимаю LinkButton, он выполняет CreateChildControls, и после того, как он вызывает событие ItemCommand, событие вызывает BuildSingleView, изменено ActiveViewIndex, но ничего не происходит на странице.

Я не понимаю, почему это не меняется. Это проблема с порядком событий? Что я могу сделать, чтобы изменить представление, когда я нажимаю LinkButton?


Вот полный код-за кодом (метод Initialize метод, который выполняет сразу после CreateChildControls) http://pastebin.com/2qwrKNxf

А вот полный ASCX файл http://pastebin.com/P8RSbY9U

ответ

0

Я понял, что когда панель сообщения обновления обратно не вызывает обработчик события первый. Поэтому, чтобы заставить его выполнить, мне нужно повторно назначить событие.

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

0

Как об использовании MultiView.SwitchViewByIndexCommandName значения, CommandName на кнопку?

Другой способ - установить скрытое поле на странице при нажатии кнопки, а затем проверить значение скрытого поля для переключения активного вида.

+0

Это интересно, но, похоже, не решает мою проблему ... – BrunoLM

0

Вам просто нужно сделать ниже:

Repeater1.ItemDataBound += (s, e) => 
{ 
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
    { 
     var Button1 = e.Item.FindControl("Button1") as LinkButton; 
     Button1.CommandArgument = item.ID.ToString(); 
    } 
}; 

перед тем Repeater1.DataBind();

Это позволит решить эту проблему, потому что ItemDataBound событие будет уволен сразу после вызова метода() DataBind. Если вы добавите нового обработчика в событие ItemDataBound после привязки ретранслятора, он никогда не будет запущен.

Я имею в виду,

Repeater1.DataSource = List; 
Repeater1.DataBind(); 

Repeater1.ItemDataBound += (s, e) => 
{ 
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
    { 
     var item = e.Item.DataItem as Person; 
     var Button1 = e.Item.FindControl("Button1") as LinkButton; 
    } 
}; 

не будет работать, но:

Repeater1.ItemDataBound += (s, e) => 
{ 
    if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) 
    { 
     var item = e.Item.DataItem as Person; 
     var Button1 = e.Item.FindControl("Button1") as LinkButton; 
    } 
}; 

Repeater1.DataSource = List; 
Repeater1.DataBind(); 

будет работать.

+0

DataBind - это последнее, что я называю. Я добавил полный источник. – BrunoLM

+0

Извините, я подумал, что это проблема, потому что я просто попробовал себя и решил так, я проверю источники, которые вы добавили. –

0

Просто мысль ... Но почему бы просто не назначить ID как Eval/Bind? (Это то же самое в vb.net Asn C# ... правильно? Ниже, как я хотел бы сделать это в VB)

<asp:LinkButton ID="Button1" runat="server" Text="Button1" CommandName="View" CommandArgument='<%# Eval("WhateverYourIDFieldIs")' /> 
Смежные вопросы