2012-03-06 36 views
3

嗨,我得到一個頭痛與visualforce Repeater控件:Visualforce中繼

<apex:repeat value="{!productDetails}" var="o"> 
    <apex:pageBlockSectionItem > 
     <apex:outputText style="label" value="Name:"></apex:outputText> 
     <apex:outputLabel value="{!o.name}" /> 
    </apex:pageBlockSectionItem> 

    <apex:pageBlockSectionItem > 
     <apex:outputText value="{!o.ProductCode}"/> 
     <apex:outputText value="{!o.Family}" /> 
    </apex:pageblockSection> 

    <apex:pageBlockSection> 
     <apex:outputText style="label" value="Quantity:"> </apex:outputText> 
     <apex:inputText value="{!theList}"/> 
    </apex:pageblockSection> 
</apex:repeat> 

我所要做的,就是在產品的詳細信息列表中的每個記錄,生成一個文本框。該文本框綁定到另一個字段(theList.quantity)。但是我發現,當我在最後一個文本框中更改數值時,它會在所有文本框中設置數量(顯然,因爲它們綁定到相同的字段)。

所以我的問題是什麼的最佳方法有在中繼器有它自己的參數值生成的每一個文本框?

或者我使用中繼器以錯誤的方式是?

編輯(澄清):

對於每一個產品細節記錄(我所通過迭代),我想有一個文本框,用戶可以在其中輸入產品的數量。此文本框的值與產品詳細記錄無關。

我的問題是我怎麼能生成文本框的每一次迭代的唯一參數?希望這是有道理的。

乾杯

回答

2

要做到這一點,最簡單的方法是將自定義字段添加到您所重複過的對象。不過,據我所知,有些情況並不理想。

你也許可以使用自定義的Apex對象(不定製的Salesforce對象)這一點。您可以通過在Controller或Extension中添加嵌套類來完成此操作。

例如:

public class MyClass 
{ 
    public class MyProductDetail 
    { 
     public string Name {get;set;} 
     public string Family {get;set;} 
     public string ProductCode {get;set;} 
     public integer Quantity {get;set;} // theList 
    } 

    public List<MyProductDetail> MyProductDetails {get;set;} 
} 

你會需要遍歷所有的產品細節記錄(從SOQL返回),並將它們添加到列表MyProductDetails。一旦你有了這些,你可以使用一個Visualforce轉發器來顯示它們中的每一個,並保存每條記錄的輸入數量數據。

<apex:repeat value="{!MyProductDetails}" var="o"> 
    <apex:pageBlockSectionItem > 
     <apex:outputText style="label" value="Name:"></apex:outputText> 
     <apex:outputLabel value="{!o.Name}" /> 
    </apex:pageBlockSectionItem> 

    <apex:pageBlockSectionItem > 
     <apex:outputText value="{!o.ProductCode}"/> 
     <apex:outputText value="{!o.Family}" /> 
    </apex:pageblockSection> 

    <apex:pageBlockSection> 
     <apex:outputText style="label" value="Quantity:"> </apex:outputText> 
     <apex:inputText value="{!o.Quantity}"/> 
    </apex:pageblockSection> 
</apex:repeat> 

希望幫助!

+0

嗨,我跟着你的代碼,但得到未知屬性'ImageController.Product.name' – Jim 2012-03-07 00:55:42

+1

子類屬性可能需要{get; set;}後面;對不起,我忘了那些。 – 2012-03-07 14:42:27

+0

修好了,謝謝! – Jim 2012-03-08 00:30:28

3

您需要使用var<apex:repeat>每個元素在productDetails列表。例如:

<apex:repeat value="{!productDetails}" var="productDetail"> 
    <apex:pageBlockSection> 
     <apex:outputText style="label" value="Quantity:"> </apex:outputText> 
     <apex:inputText value="{!productDetail.quantity}"/> 
    </apex:pageblockSection> 
</apex:repeat> 

,將設置每個productDetail的的quantity財產。

如果您真的在本示例中遍歷productDetail的父級,那麼您需要更改控制器以爲每個父級創建一個父級,然後對其進行迭代。我將編寫示例代碼,就好像您在迭代潛在訂單列表一樣。

在你的控制器,你需要爲每個產品的訂單。我不確定父級是SObject還是自定義類,但我會將該示例編寫爲自定義類。現在

public class Order { 
    public Order(ProductDetail productDetail) { 
     this.productDetail = productDetail; 
    } 

    public ProductDetail productDetail; 
    public Integer quantity; 
} 

// I assume you've already implemented this getter or are setting it some other way. 
public ProductDetail[] productDetails { 
    get { 
     if (productDetails == null) { 
      productDetails = ...; 
     } 
     return productDetails; 
    } 
    set; 
} 

public Order[] orders { 
    get { 
     if (orders == null) { 
      orders = new Order[]{}; 
      for (ProductDetail productDetail: productDetails) { 
       orders.add(new Order(productDetail); 
      } 
     } 
     return orders; 
    } 
    set; 
} 

,在你的VisualForce頁面,您可以遍歷Order名單,並讓用戶設置的數量。

<apex:repeat value="{!orders}" var="order"> 
    ... 
    <apex:outputtext style="label" value="Name:"></apex:outputText> 
    <apex:outputLabel value="{!order.productDetail.name}" /> 
    ... 
    <apex:inputText value="{!order.quantity}"/> 
    .... 
</apex:repeat> 

回到你的控制器,只保存orders有超過零(或任何其他條件,你心裏有)一個quantity

+0

嗨感謝您的答覆 - productDetail沒有一個名爲數量的字段,我只是想爲每個productDetail記錄生成一個新的文本框。 – Jim 2012-03-06 21:25:01

+0

你想要那個文本框綁定到什麼? – barelyknown 2012-03-06 21:30:24

+0

任何參數,所以我可以訪問用戶在代碼隱藏中輸入的值。 – Jim 2012-03-06 21:34:00