2008-09-10 73 views
4

這是一個ASP.Net 2.0 web應用程序。項模板看起來像這樣,以供參考:以編程方式訪問ASP.NET 2.0轉發器中的數據

<ItemTemplate> 
    <tr> 
    <td class="class1" align=center><a href='url'><img src="img.gif"></a></td> 
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field1") %></td> 
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field2") %></td> 
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field3") %></td> 
    <td class="class1"><%# DataBinder.Eval(Container.DataItem,"field4") %></td> 
    </tr> 
</ItemTemplate> 

在代碼隱藏使用此:

foreach (RepeaterItem item in rptrFollowupSummary.Items) 
{ 
    string val = ((DataBoundLiteralControl)item.Controls[0]).Text; 
    Trace.Write(val); 
} 

我產生這樣的:

<tr> 
    <td class="class1" align=center><a href='url'><img src="img.gif"></a></td> 
    <td class="class1">23</td> 
    <td class="class1">1/1/2000</td> 
    <td class="class1">-2</td> 
    <td class="class1">11</td> 
</tr> 

我需要的是從字段1和字段4中的數據

我似乎無法得到數據的方式,我會說一個DataList或一個GridView,我的CA似乎沒有拿出任何其他谷歌或快速利用這一個做我想做的。我能看到數據的唯一方法是使用正則表達式去獲取它(因爲一個人得到他想要的東西,他把它全部拿走,而我是一個男人,不是嗎?Aren我呢?)。

我在正確的軌道上(不是尋找具體的正則表達式來做到這一點;鍛造可能是後續問題;)),還是我錯過了什麼?


在這種情況下,直放站設置石頭,所以我不能切換到更優雅的東西。曾幾何時,我做了類似於Alison Zhou建議使用DataLists的東西,但已經有一段時間(2年以上),我完全忘記了這樣做。 Yeesh,談論忽略明顯的東西。 。 。

所以我做了艾莉森建議,它工作正常。我不認爲viewstate在這裏是一個問題,即使這個repeater可以得到幾十行。我不能真正說出這樣的問題,如果這樣做,而不是使用它(但對我來說,這似乎是一個很好的解決方案)。很顯然,後者不太適合觀察足跡,但我還沒有足夠的經驗來說明,如果在我面前沒有一個極端的例子,一種方法可能更適合另一種方法。艾莉森,一個問題:爲什麼是文字而不是標籤?

歐元Micelli,我試圖避免回到數據庫。由於我相對於其他發展世界而言仍然有點綠色,我承認我不一定能夠很好地掌握有多少數據庫訪問「恰到好處」。這裏不會有性能問題(我知道應用程序的負載足以瞭解這一點),但是我想我正試圖避免它出於習慣,因爲我的老闆在可能的情況下傾向於強調更少的行程。

+0

我不明白「獲取」數據的含義。您是否有權訪問rptrFollowUpSummary,這是否意味着您已經擁有原始數據? – 2008-09-10 17:05:18

回答

6

關閉我的頭頂,你可以嘗試這樣的事:

<ItemTemplate> 
    <tr> 
    <td "class1"><asp:Literal ID="litField1" runat="server" Text='<%# Bind("Field1") %>'/></td> 
    <td "class1"><asp:Literal ID="litField2" runat="server" Text='<%# Bind("Field2") %>'/></td> 
    <td "class1"><asp:Literal ID="litField3" runat="server" Text='<%# Bind("Field3") %>'/></td> 
    <td "class1"><asp:Literal ID="litField4" runat="server" Text='<%# Bind("Field4") %>'/></td> 
    </tr> 
</ItemTemplate> 

然後,在後面的代碼,你可以按如下方法訪問每一個文字控制:

foreach (RepeaterItem item in rptrFollowupSummary.Items) 
{ 
    Literal lit1 = (Literal)item.FindControl("litField1"); 
    string value1 = lit1.Text; 
    Literal lit4 = (Literal)item.FindControl("litField4"); 
    string value4 = lit4.Text; 
} 

這將添加到您的ViewState,但它可以很容易地找到您的控件。

2

由於您使用表格數據,我建議使用GridView控件。然後你將能夠訪問單個單元格。

否則,您可以將Field1和Field4的td設置爲runat="server",併爲其指定ID。然後在代碼隱藏中,訪問每個td的InnerText屬性。

0

如果你在代中能夠承受更多的開銷,去DataList並使用DataKeys屬性,它將保存你需要的數據字段。

您也可以在每個表格單元格中使用標籤,並且可以使用e.Item.FindControl(「LabelID」)引用項目。

0

<%#DataBinder.Eval(...)%>機制不是「嚴格」意義上的數據綁定。將文本放在模板中的特定位置是一種單向技術。

如果你需要找回數據時,你必須要麼:

  1. 從源數據得到它
  2. 用不同的機制

注意填充中繼器的Repeater不會在回發之間保存DataSource,您不能直接要求它在稍後提供數據。

第一種方法通常更容易處理。不要認爲從源頭重新獲取數據太昂貴,除非您通過測量證明自己;它通常很快。這種技術最大的問題是源數據可能在不同的調用之間改變。

對於第二種方法,常用技巧是使用文字控件。有關如何操作的示例,請參閱Alison Zhou的帖子。通常我個人比較喜歡充實內心的OnItemDataBound代替

0

@peacedog的文字控制:

正確的;艾莉森的方法是完全可以接受的。顯然,它們並不是免費的,但Web服務器往往會非常「靠近」(快速,低延遲連接)到數據庫,而您的用戶可能「很遠」(慢,高延遲連接)。

因此,通過cookies,ViewState,隱藏字段或任何其他方法向瀏覽器發送/從瀏覽器發送數據實際上可能比從數據庫中再次讀取更糟糕。還要記住安全隱患(一個「邪惡的」用戶是否可以僞造從瀏覽器返回的數據?它們會這樣做嗎?)。

但很多時候它在性能上沒有任何區別。這就是爲什麼你應該做更適合你的特殊問題的更自然的做法,並且只爲擔心,如果表現開始成爲現實世界的問題。

祝你好運!