ASP.NET动态控件添加

时间:2011-02-03 21:10:15

标签: c# asp.net dynamic repeater

原始帖子

有一篇的文章,比我在这个问题上发布的答案还要多得多。

我有一个我正在创建的网页,它将具有产品的DropDownList控件,用户可以选择进入订单进行处理。除此之外,还有两(2)个其他DropDownList控件,其中包含每个特定产品的选项附件 。我希望用户能够在 order 对象中输入多个 product 行,以便与相应的选项和/或*附件一起进行处理。这将减少为数据库中的客户信息存储的记录数量。

当用户从此DropDownList中选择时,我想创建产品的列表,但是必须根据产品的数量动态创建此列表用户必须输入特定的订单。我理解保存数据所涉及的需求,因为它不会自动保存到ViewState,但却无法确定如何将数据推向正确的方向。

由于处理ViewState的复杂性,我是否应该使用ASP.NET之外的其他东西来创建我的网页?虽然它可能很复杂,但在尝试这样的行动时是否有更好的方法?

修改

所以我的发现让我相信,为了在添加数据时正确存储数据,我应该使用Repeater控件和DataBind,它包含在KeyValuePairs中包含我的数据的Dictionary对象。我正在寻找一种简化的方法来直接添加一个包含我需要的所有数据的对象。我当然可以将这个类添加到Repeater和DataBind中,但是将数据重新保存在Repeater之外会导致我出现一些问题。

public class Order
{
    public Order() { }
    public string CustomerNamer { get; set; }
    public ProductList ProductOrdered { get; set; }
}
public class ProductList : List<Product>
{
     public ProductList() { }
}
public class Product
{
     public Product() { }
     public int ID { get; set; }
     public string Name { get; set; }
     public string ProdcutCode { get; set; }
}

背后的代码:

protected void order_add_Click(object sender, EventArgs e)
{
        Dictionary<int, Order> objOrders = new Dictionary<int, Order>();

        Order objOrder = new Order();
        Product objProduct = new Product();

        objProduct.Name = "Tire";
        objProduct.ProductCode = "75R15";

        objOrder.ProductsOrdered = new ProductList();

        objOrder.ProductsOrdered.Add(objProduct);

        objOrders.Add(0, objOrder);

        rptTest.DataSource = objOrders;
        rptTest.DataBind();
}

1 个答案:

答案 0 :(得分:0)

对于通过呈现页面中的Repeater表示的动态集合,我已多次成功使用此模式:

创建可以表示信息的内存中结构。

将此结构公开为页面上的属性,并在内部将其存储在SessionViewState中。

public List<Order> Orders { get { return ViewState("OrdersList"); } set { ViewState("OrdersList") = value; } }

DataBind()到转发器并使绑定将您的内存中对象转换为呈现时应该看起来的任何内容。

在回发后,阅读转发器中的任何更改并更新内存中的数据结构(在Page_Load处理程序 - &gt; if (!IsPostback) {...}中)。

当需要继续选择DB(或提交订单等)时,只需从内存商店中读取信息。