2010-03-16 54 views
2

我有一個ASP:Repeater我想顯示一個複選框列表。這些複選框與用戶首選項列表和用戶結果答案相關。見Code Bellow。asp:中繼器事件 - 如何回發

我想補充做,如果可能的

選項1下列之一:這將是巨大的,如果我可以使用該事件在Repeater:OnItemCommand(...)火,如果任何項目的改變。在我看來,如果有Button |,這個事件只會觸發LinkBut​​ton | ImageButton項目在列表中。 IE瀏覽器將不火,如果我把與自動回發一個複選框=「真」

選項2:有沒有一種方法,我可以附加到CheckBox的事件的方法:CheckChanged我需要通過這個方法一個參數說明要改變哪個問題/答案組合。

選項3:它的答案,如果你知道一個更簡單的方法,將是可怕的。

守則

<asp:Repeater ID="RPTprefs" runat="server" DataSourceID="getAnswers" OnItemCommand="RPTprefs_ItemCommand"> 
     <ItemTemplate> 
     <li><asp:CheckBox ID='questionID' runat="server" 
     Checked='<%# Eval("pr.up_is_selected") %>' 
     Text='<%# Eval("prp.prefs_question") %>' 
     AutoPostBack="true" 
     OnCheckedChanged="CheckChanged" /></li> 
       </ItemTemplate> 
       </asp:Repeater> 

在此先感謝

回答

4

這裏是我想出了,這基本上是你的選擇#2。 在轉發器的ItemTemplate中,我使用一個Literal控件(可見設置爲false),它具有您想要傳遞給CheckedChanged函數的參數。使用控件的原因是因爲控件將在回發後保留其在ViewState中的值,而Repeater的原始數據源將丟失。

OnItemCreated函數中,我綁定了所有複選框的CheckChanged函數以傳遞正確的參數。這是我完整的例子。在這種情況下,我想將我的數據的Id屬性傳遞給CheckChanged函數。

標記:

<asp:Repeater ID="Repeater1" runat="server" OnItemCreated="ItemCreated"> 
     <ItemTemplate> 
      <asp:Literal ID="litArg" runat="server" Visible="false" Text='<%# Eval("Id") %>'> 
      </asp:Literal><%# Eval("Name") %> 
      <asp:CheckBox ID="chkCool" runat="server" AutoPostBack="true" Checked='<%# Eval("IsCool") %>' /><br /> 
     </ItemTemplate> 
</asp:Repeater> 

後面的代碼:

public class SomeClass 
{ 
    public SomeClass(bool c, string n, int id) 
    { 
     IsCool = c; 
     Name = n; 
     Id = id; 
    } 
    public bool IsCool { get; set; } 
    public string Name { get; set; } 
    public int Id { get; set; } 
} 
. 
. 
. 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     List<SomeClass> people = new List<SomeClass>(); 

     people.Add(new SomeClass(true, "Will", 666)); 
     people.Add(new SomeClass(true, "Dan", 2)); 
     people.Add(new SomeClass(true, "Lea", 4)); 
     people.Add(new SomeClass(false, "Someone", 123)); 

     Repeater1.DataSource = people; 
     Repeater1.DataBind(); 
    } 
} 

private void CheckChanged(int id) 
{ 
    Response.Write("CheckChanged called for item #" + id.ToString()); 
} 

protected void ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    //this needs to be set again on post back 
    CheckBox chk = (CheckBox)e.Item.FindControl("chkCool"); 
    Literal arg = (Literal)e.Item.FindControl("litArg"); 

    Action<object, EventArgs> handler = (s, args) => CheckChanged(Convert.ToInt32(arg.Text)); 
    chk.CheckedChanged += new EventHandler(handler); 
} 

希望有所幫助。

+1

謝謝,謝謝。一千次感謝你。我一直在試圖解決這個問題2天。你真的爲這個答案付出了一點努力,我希望我能不止一次地投票。 ;) – Kieran 2010-03-16 04:31:40

+2

沒問題:)。我得說,有時候asp.net控件並不容易處理。 – wsanville 2010-03-16 11:47:16