我已经在我的页面中定义了一个占位符,就像这样;
<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循环。
注意: 请注意,这不是我整个页面的完整代码。我的其余代码正确执行。
答案 0 :(得分:4)
为什么我无法进入foreach循环内部
因为列表是空的。
为什么列表为空? (将是下一个合乎逻辑的问题)
因为,在ASP.Net上,必须在Page_Init
重新创建动态创建的控件才能存在。在此阶段创建它们时,页面生命周期将绑定视图状态并准备使用。
如果您收到回发(例如,从按钮)并且不重新创建它们,则它们根本就不存在。