1

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

<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);
}

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

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

4

1 回答 1

4

为什么我无法进入 foreach 循环

因为列表是空的。

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

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

于 2012-08-06T18:01:38.440 回答