2009-05-29 242 views
2

訪問的RepeaterItem控件我有一個在它的中繼器的頁面。我正在編寫一個事件處理程序,以便當用戶單擊我的WebControl按鈕時,所述按鈕的事件處理程序使用FindControl遍歷中繼器中的項目,然後使用一些控件的值。看來雖然,在頁面加載後,中繼器填入商品信息,但點擊按鈕時發佈這一回,因爲我通過中繼項目重複,我看到的是他們都是空的。我不完全瞭解排序,但我假設這是因爲我的迭代代碼試圖訪問尚未設置的RepeaterItems。在事件處理程序

中繼器的代碼是在我的OnLoad方法。除此之外,我有我的事件處理程序試圖在點擊後遍歷這些項目。這基本上是我試圖做的:

protected void MyButton_Click(object sender, EventArgs e) 
{ 
    foreach(RepeaterItem item in MyRepeater.Items) 
    { 
     MyLabel = (Label)item.FindControl("MyLabel"); 
    } 
} 

該按鈕位於中繼器的FooterTemplate中。

<asp:Button runat="server" OnClick="SubmitChecklist_Click" cssclass="BlueSubmit" id="SubmitChecklist" text="Submit" /> 

在此先感謝。

編輯:爲了澄清,我得到確切的錯誤是NullReferenceException異常,當我嘗試做一些事情,例如回覆於(MyLabel.Text)

編輯:尋找到更後的今天,這就是我所理解的情況:轉發器是回發的數據綁定。當我從生成的下拉列表中選擇並點擊我的按鈕時,它會再次發佈。此時,中繼器再次將數據綁定到初始值。所以,如果我必須爲了得到用戶的選擇回傳,我怎麼能去這個按鈕的事件處理程序,這樣我可以得到中繼器之前選定的值被再次數據綁定?

+0

你在哪裏接線你的事件處理程序?您發佈的代碼應該沒問題 - 這是沒有設置的項目的問題。 – 2009-05-29 21:24:48

+0

你能從對象發件人那裏得到任何信息嗎? – jrcs3 2009-05-29 21:27:45

+0

我能夠Response.Write發件人的哈希碼,所以我假設如此。 – 2009-05-29 21:31:46

回答

0

我不是依靠OnLoad中的IsPostBack,而是通過在用戶選擇第一個選項後將事件處理程序的數據綁定放入事件處理程序的內部,而不是依靠OnLoad的IsPostBack來分離所有不同的狀態。這有點複雜,但我認爲我這次做的是正確的。

3

的問題,這聽起來像,就是你可以在數據綁定到您的轉發器上的負載,而不是首先檢查,以確保它不是一個回。

例如:

  1. 您請求的頁面。在加載火災。您將數據綁定到中繼器。
  2. 您在reapter maniupulate數據然後單擊您的按鈕
  3. 的頁面刷新,回發,發射onload事件。數據將被重新提交給您的中繼器,並且所有以前輸入的數據都將被取消。
  4. onclick事件被觸發,你的代碼試圖檢索不再存在的價值。

,讓您的onLoad事件確保您的數據綁定代碼嵌套在回發檢查

if (!Page.IsPostBack) 
{ 
    Repeater.DataSource = Datatable; 
    Repeater.DataBind(); 
} 
0

我已經看到了同樣的事情中。我不明白爲什麼,但是在所有事件發生之前,數據並沒有真正被綁定。我最終在課堂上提供了我的數據源,然後建立索引。

private DataTable myTable; 
protected void Page_Load(object sender, EventArgs e) 
{ 
    //populate dataTable 
    if (!IsPostBack) 
    { 
     //databind to repeater 
    } 
} 

protected void Submit_Click(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem item in repeater1.Items) 
    { 
     DataRow row = myTable.Rows[item.ItemIndex]; 
    } 
} 

理想?當然不是,但它的工作原理。