嗨,我对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)。但我发现,当我更改最后一个文本框中的值时,它会设置所有文本框中的数量(很明显,因为它们绑定到相同的字段)。
所以我的问题是,在中继器中生成的每个文本框都有自己的参数值,最好的方法是什么?
还是我用错了中继器?
编辑(澄清):
对于每个产品详细信息记录(我正在迭代的内容),我希望有一个文本框,用户可以在其中输入产品数量。此文本框的值与产品详细信息记录无关。
我的问题是,如何为textbox的每次迭代生成唯一的参数?希望这是有意义的。
干杯
发布于 2012-03-07 06:41:27
要做到这一点,最简单的方法是向正在重复的对象添加自定义字段。然而,我知道有些情况下这是不可取的。
为此,您可以使用自定义的Apex对象(而不是自定义的Salesforce对象)。您可以通过在您的Controller或扩展中添加嵌套类来完成此操作。
例如:
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;}
}您需要遍历所有的Product detail记录(从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>希望这能有所帮助!
发布于 2012-03-07 05:18:34
您需要在<apex:repeat>中为productDetails列表中的每个元素使用var。例如:
<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>回到您的控制器中,只保存quantity大于零的orders (或您脑海中的任何其他标准)。
https://stackoverflow.com/questions/9592009
复制相似问题