Asp.Net从PlaceHolder获取控制值

时间:2012-08-06 17:54:58

标签: c# foreach placeholder

我已经在我的页面中定义了一个占位符,就像这样;

<asp:PlaceHolder ID="attrPlaceHolder" runat="server"></asp:PlaceHolder> 

我使用像这样的查询字符串productId从数据库表中填充此占位符;

 // obtain the attributes of the product
                DataTable attrTable = CatalogAccess.GetProductAttributes(productId);
                // temp variables
                string prevAttributeName = "";
                string attributeName, attributeValue, attributeValueId;
                // current DropDown for attribute values
                Label attributeNameLabel;
                DropDownList attributeValuesDropDown = new DropDownList();
                // read the list of attributes
                foreach (DataRow r in attrTable.Rows)
                {
                    // get attribute data
                    attributeName = r["AttributeName"].ToString();
                    attributeValue = r["AttributeValue"].ToString();
                    attributeValueId = r["AttributeValueID"].ToString();
                    // if starting a new attribute (e.g. Color, Size)
                    if (attributeName != prevAttributeName)
                    {
                        prevAttributeName = attributeName;
                        attributeNameLabel = new Label();
                        attributeNameLabel.Text = "<li class=\"txt\">" + attributeName + ":</li>";
                        attributeValuesDropDown = new DropDownList();
                        attrPlaceHolder.Controls.Add(attributeNameLabel);
                        attrPlaceHolder.Controls.Add(attributeValuesDropDown);
                    }
                    // add a new attribute value to the DropDownList
                    attributeValuesDropDown.Items.Add(new ListItem(attributeValue, attributeValueId));
                }

然而,当我在按钮点击事件中,当我使用visual studio调试循环遍历这个地方时,我看到visual studio studio调试器首先点击我的foreach中的“ attrPlaceHolder.Controls”字循环,然后第二个来到' in'关键字(在foreach循环中),但它没有达到我的foreach循环中的前两个单词(即'Control cnt'。在这里看起来;

protected void ButtonBuyNow_Click(object sender, EventArgs e)
{
    // Retrieve the selected product options
    string options = "";
    foreach (Control cnt in attrPlaceHolder.Controls)
    {
        if (cnt is Label)
        {
            Label attrLabel = (Label)cnt;
            options += attrLabel.Text;
        }

        if (cnt is DropDownList)
        {
            DropDownList attrDropDown = (DropDownList)cnt;
            options += attrDropDown.Items[attrDropDown.SelectedIndex] + "; ";
        }
    }

    // Add the product to the shopping cart
    ShoppingCartAccess.AddItem(productId, options);
}

基本上我需要填充“选项”变量,但它不会触及内部的foreach循环,因此我无法填充'options'变量。 这是我的应用程序中的一个严重问题。请告诉我为什么我无法进入foreach循环

注意: 请注意,这不是我整个页面的完整代码。我的其余代码正确执行。

1 个答案:

答案 0 :(得分:4)

  

为什么我无法进入foreach循环内部

因为列表是空的。

  

为什么列表为空? (将是下一个合乎逻辑的问题)

因为,在ASP.Net上,必须在Page_Init重新创建动态创建的控件才能存在。在此阶段创建它们时,页面生命周期将绑定视图状态并准备使用。 如果您收到回发(例如,从按钮)并且不重新创建它们,则它们根本就不存在。