2009-05-22 156 views
1

我正在使用一個使用中繼器的表單,我一直在努力,我正在嘗試編寫一個事件處理程序,它將獲得中繼器中某些控件的值在提交包含中繼器的表單之後。我認爲,如果我想找回從第一中繼器項目的標籤類似這樣的東西會工作,那麼它的文本設置爲其它標籤的文本:需要FindControl功能的幫助

protected void SubmitMessage_Click(object sender, EventArgs e) 
{ 
    Label MyLabel = (Label)MyRepeater.Items[0].FindControl("MessageID"); 
    MyLabel2.Text = MyLabel.Text; 
} 

但是利用這一點,似乎MyLabel .Text是空的。設置後如果測試MyLabel爲空,則結果爲false,因此我試圖找出爲什麼MyLabel的內容不會與我嘗試設置的重複項目中的內容相同。 MyLabel2已經在類的頂部聲明瞭。提前致謝。

編輯:.aspx文件中的標籤文本不是在文本屬性內的數據綁定,而是在標籤本身的容器中。我會在星期二早上嘗試另一種方法,只要我能回到我的代碼中,就本傑明的建議。

+0

鬱鬱蔥蔥,你可以發佈你的HTML/ASPX片段告訴我們你是如何產生這個。 – 2009-05-23 00:46:07

+0

實際上,如果您可以發佈URL或原始HTML輸出,我可以告訴很多 - 我通常使用FireBug來查看信息如何輸出到屏幕。它和quickwatch之間很容易找到任何東西 – 2009-05-23 05:10:24

+0

輸出HTML只是一個空白的跨度。 – 2009-05-23 14:21:29

回答

2

它涉及到如何綁定將數據發送到中繼器上的標籤。

<asp:Repeater ID="Repeater1" runat="server"> 

<ItemTemplate> 

    <asp:Label ID="Label1" runat="server"><%# DataBinder.Eval(Container.DataItem,"CustomerName") %></asp:Label> 

    <asp:Label ID="Label2" runat="server" Text=<%# DataBinder.Eval(Container.DataItem,"Country") %>></asp:Label> 

    </ItemTemplate> 
</asp:Repeater> 

Label1的文本屬性未設置和數據 被在客戶端結合到在標籤的本體控制。 在Label已經呈現到頁面之後被寫入span標記,並且永遠不會直接綁定到Label Control。只有當您在標籤主體中使用行腳本時纔會發生這種情況,如果它只是文本,則標籤的主體始終會覆蓋Label的Text Attribute值。

對於Label2的文本屬性被設置 因此正在發生服務器 迫使它呈現完畢後的標籤,因此你的其他控件訪問之前評估內嵌腳本的結合。

沒有真正看到你的中繼器,我懷疑這是你的數據綁定的方式。

這裏有一些測試代碼向你證明這種情況。

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      DataSet ds = new DataSet(); 
      DataTable dt = ds.Tables.Add("Customer"); 
      dt.Columns.Add("CustomerName", Type.GetType("System.String")); 
      dt.Columns.Add("Country", Type.GetType("System.String")); 

      DataRow dr = dt.NewRow(); 
      dr[0] = "Testcustomer1"; 
      dr[1] = "USA"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer2"; 
      dr[1] = "UK"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer3"; 
      dr[1] = "GERMANY"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer4"; 
      dr[1] = "FRANCE"; 
      dt.Rows.Add(dr); 

      //Bind the data to the Repeater 
      Repeater1.DataSource = ds; 
      Repeater1.DataMember = "Customer"; 
      Repeater1.DataBind(); 
     } 

    } 

    protected void SubmitMessage_Click(object sender, EventArgs e) 
    { 
     Label MyLabel = (Label)Repeater1.Items[0].FindControl("Label1"); 
     Label MyLabel2 = (Label)Repeater1.Items[0].FindControl("Label2"); 
     //Empty String Text was never set server side 
     Label3.Text = MyLabel.Text; 
     //String is found because Text was set 
     Label4.Text = MyLabel2.Text; 
    } 

插入並添加幾個額外的標籤,您將看到Label4有您正在查找的數據,而Label3是空白的。

0

我不確定這個,但是當事件執行時,中繼器可能還沒有重新填充。由於該方法的調用是「ByVal」(VB說)而不是ByRef值可能會通過,但原始對象尚未填充...只是一個想法...