您好我对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)。但我发现当我更改最后一个文本框中的值时,它会在所有文本框中设置数量(显然它们绑定到同一个字段)。
所以我的问题是,在转发器中生成的每个文本框都有自己的参数值的最佳方法是什么?
或者我是以错误的方式使用转发器?
编辑(澄清):
对于每个产品详细记录(我正在迭代的内容)我希望有一个文本框,用户可以在其中输入产品数量。此文本框的值与产品详细信息记录无关。
我的问题是如何为文本框的每次迭代生成唯一参数?希望这是有道理的。
干杯
答案 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>
希望有所帮助!