Visualforce中继器

时间:2012-03-06 21:13:34

标签: salesforce visualforce

您好我对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>

我要做的是,对于产品详细信息列表中的每条记录,生成一个文本框。此文本框绑定到另一个字段(List.quantity)。但我发现当我更改最后一个文本框中的值时,它会在所有文本框中设置数量(显然它们绑定到同一个字段)。

所以我的问题是,在转发器中生成的每个文本框都有自己的参数值的最佳方法是什么?

或者我是以错误的方式使用转发器?

编辑(澄清):

对于每个产品详细记录(我正在迭代的内容)我希望有一个文本框,用户可以在其中输入产品数量。此文本框的值与产品详细信息记录无关。

我的问题是如何为文本框的每次迭代生成唯一参数?希望这是有道理的。

干杯

2 个答案:

答案 0 :(得分: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>

这将设置每个quantity的{​​{1}}属性。

如果您真的在本例中迭代productDetail的父级,那么您需要更改控制器以为每个父级创建父级,然后对其进行迭代。我将编写示例代码,就好像您正在迭代潜在订单列表一样。

在您的控制器中,您需要为每个产品创建订单。我不确定父对象是SObject还是自定义类,但我会将示例编写为自定义类。

productDetail

现在,在VisualForce页面中,您可以遍历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; } 列表并让用户设置数量。

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(或您考虑的任何其他条件)。

答案 1 :(得分: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 Repeater来显示它们,并保存每条记录的输入数量数据。

<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>

希望有所帮助!