获得以下错误
找到了具有相同ID“ltlItemCode”的多个控件。 FindControl要求控件具有唯一ID。
在页面加载时不会发生此错误,但是当我更改具有AutoPostBack =“true”的下拉值时。
代码是
//Number of Services
numberofServices = Int32.Parse(DCCFunctions.GetNumServicesPerRoom(roomId.ToString()));
additionalServices = new UserControls_AdditionalService[numberofServices - 1];
String htmlTable = String.Empty;
Int32 cell = 1;
Int32 rows = numberofServices;
Int32 cols = 4;
TableHeaderRow h = new TableHeaderRow();
TableHeaderCell hc1 = new TableHeaderCell();
hc1.Text = "Item Description";
h.Cells.Add(hc1);
TableHeaderCell hc2 = new TableHeaderCell();
hc2.Text = "Item Price";
h.Cells.Add(hc2);
TableHeaderCell hc3 = new TableHeaderCell();
hc3.Text = "Item Quantity";
h.Cells.Add(hc3);
TableHeaderCell hc4 = new TableHeaderCell();
hc4.Text = "Item Sub Total";
h.Cells.Add(hc4);
Table1.Rows.Add(h);
// Open database connection
DBConnection conn = new DBConnection();
// Retrieve details
SqlCommand sqlGetDetails = conn.SetStoredProcedure("spGetAdditionalServicesDetails");
DBConnection.AddNewParameter(sqlGetDetails, "@roomId", ParameterDirection.Input, SqlDbType.Int, roomId);
try
{
conn.Open();
SqlDataReader reader_list = sqlGetDetails.ExecuteReader();
if (reader_list.HasRows)
{
while (reader_list.Read())
{
//returnVal = reader_list["Num"].ToString();
htmlTable += "<tr>" + Environment.NewLine;
TableRow r = new TableRow();
additionalServices[cell - 1] = (ASP.usercontrols_additionalservice_ascx)LoadControl("~/UserControls/AdditionalService.ascx");
Literal ItemCode = (Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal;
ItemCode.Text = reader_list["itemDescription"].ToString();
Literal ItemPrice = (Literal)additionalServices[cell - 1].FindControl("ltlItemPrice") as Literal;
ItemPrice.Text = "€" + reader_list["unitPrice"].ToString();
Literal ItemTotal = (Literal)additionalServices[cell - 1].FindControl("ltlTotalPrice") as Literal;
ItemTotal.Text = "€" + "0";
TableCell ItemCodeCell = new TableCell();
ItemCodeCell.Controls.Add((Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal);
TableCell ItemCodePriceCell = new TableCell();
ItemCodePriceCell.Controls.Add((Literal)additionalServices[cell - 1].FindControl("ltlItemPrice") as Literal);
TableCell ItemCodeTotalCell = new TableCell();
ItemCodeTotalCell.Controls.Add((Literal)additionalServices[cell - 1].FindControl("ltlTotalPrice") as Literal);
TableCell c = new TableCell();
DropDownList qtyList = (DropDownList)additionalServices[cell - 1].FindControl("qtyList") as DropDownList;
qtyList.Items.Add(new System.Web.UI.WebControls.ListItem("Select Quantity...", "0"));
qtyList.DataBind();
for (Int32 count = 1; count < 101; count++)
{
qtyList.Items.Add(new System.Web.UI.WebControls.ListItem(count.ToString(),count.ToString()));
}
//c.ColumnSpan = 5;
c.Controls.Add((DropDownList)additionalServices[cell - 1].FindControl("qtyList") as DropDownList);
r.Cells.Add(ItemCodeCell);
r.Cells.Add(ItemCodePriceCell);
r.Cells.Add(c);
r.Cells.Add(ItemCodeTotalCell);
//r.Controls.Add(additionalServices[cell - 1]);
//cell += 1;
// Add the row
Table1.Rows.Add(r);
}
}
reader_list.Close();
}
catch (Exception ex)
{
M1Utils.ErrorHandler(ex);
}
finally
{
conn.Close();
}`
答案 0 :(得分:3)
ItemCodeCell.Controls.Add((Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal);
我猜这是问题,看起来你一遍又一遍地添加相同的控件,但我不确定。尝试更改新添加的Literal的.ID。
另外,我之前从未使用过"EnsureID()",但它似乎有所帮助。
的内容
Literal duplicateLiteral = (Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal;
duplicateLiteral.EnsureID();
ItemCodeCell.Controls.Add(duplicateLiteral);
这可能不起作用,因为看起来它会反复插入duplicateLiteral的同一副本,但是,我不确定。
答案 1 :(得分:3)
我同意看起来你一遍又一遍地添加相同的Control会导致命名冲突。看起来您可能正在以错误的顺序向其他控件'控件集合添加控件。例如,您按以下顺序添加:
TableHeaderRow h = new TableHeaderRow();
TableHeaderCell hc1 = new TableHeaderCell();
hc1.Text = "Item Description";
h.Cells.Add(hc1);
TableHeaderCell hc2 = new TableHeaderCell();
hc2.Text = "Item Price";
h.Cells.Add(hc2);
TableHeaderCell hc3 = new TableHeaderCell();
hc3.Text = "Item Quantity";
h.Cells.Add(hc3);
TableHeaderCell hc4 = new TableHeaderCell();
hc4.Text = "Item Sub Total";
h.Cells.Add(hc4);
Table1.Rows.Add(h);
当你真的应该按此顺序添加时:
TableHeaderRow h = new TableHeaderRow();
Table1.Rows.Add(h);
TableHeaderCell hc1 = new TableHeaderCell();
h.Cells.Add(hc1);
hc1.Text = "Item Description";
TableHeaderCell hc2 = new TableHeaderCell();
h.Cells.Add(hc2);
hc2.Text = "Item Price";
TableHeaderCell hc3 = new TableHeaderCell();
h.Cells.Add(hc3);
hc3.Text = "Item Quantity";
TableHeaderCell hc4 = new TableHeaderCell();
h.Cells.Add(hc4);
hc4.Text = "Item Sub Total";
通常,我总是尝试尽快向父控件集合添加新控件,以确保任何子控件都继承正确的UniqueID。如果您创建一个新的Control X并开始添加到X.Controls,那么在将X添加到父Controls集合之前,子控件可能不会继承正确的UniqueID。
答案 2 :(得分:1)
我认为EnsureID不会解决您的问题,因为这只会为尚未拥有的控件创建一个ID。
正如艾伦指出的那样,你一遍又一遍地添加相同的控件。您需要创建新控件,这将为您提供新ID。你也在调用FindControl来控制你已经引用的控件......?如果需要,从现有控件复制数据,但不要重复添加现有控件。对于一个文字,可能唯一有价值的是文本?因此,将代码更改为:
Literal ItemCode = (Literal)additionalServices[cell - 1].FindControl("ltlItemCode") as Literal;
ItemCode.Text = reader_list["itemDescription"].ToString();
Literal ItemCode2 = new Literal(); //create a new control
ItemCode2.Text = ItemCode.Text; //copy the data you need
TableCell ItemCodeCell = new TableCell();
ItemCodeCell.Controls.Add(ItemCode2); // add new control