我有一个下拉列表,我用db中的数据填充它,在选择下拉列表项时,将根据选择动态生成按钮。
但是我遇到了这个错误:
无法找到,或者为同一ID分配了不同的控件 回发后。如果未分配ID,请显式设置ID 控制的属性,用于引发回发事件以避免此错误。
这些是我的代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindActivity();
}
if (dropListActivity.SelectedIndex != 0)
{
PopulateButtons(Convert.ToInt32(dropListActivity.SelectedValue));
StoryIcons();
}
}
protected void BindActivity()
{
dropListActivity.DataSource = daoActivity.GetAll();
dropListActivity.DataTextField = "ActivityName";
dropListActivity.DataValueField = "ActivityID";
dropListActivity.DataBind();
dropListActivity.Items.Insert(0, new ListItem(String.Empty, String.Empty));
dropListActivity.SelectedIndex = 0;
}
PopulateButtons太长了所以我只想发布一半(因为我不知道它是否相关)。
protected void PopulateButtons(int id)
{
// IList<ModelSQL.task> lol = daoTask.GetBasedOnKey(id);
IList<ModelSQL.ActivityTask> actTask = daoActivityTask.GetBasedOnKey(id);
foreach (ModelSQL.ActivityTask task in actTask)
{
if(task.GroupID == null)
{
ImageButton test = new ImageButton();
test.ImageUrl = daoTask.GetURL(id, task.taskID);
test.ToolTip = daoTask.GetTaskName(task.taskID);
test.Width = 100;
test.Height = 100;
test.Click += (source, e) =>
{
// Question(Convert.ToInt32(dropListActivity.SelectedValue),Convert.ToInt32(taskid.Text));
Session["activityID"] = dropListActivity.SelectedValue;
Session["taskID"] = daoTask.GetID(test.ToolTip , id);
Response.Redirect("DisplayQuestion.aspx");
};
Literal lc = new Literal();
lc.Text = " ";
AddToPanels(test);
AddToPanels(lc);
i++;
}
} // end of foreach where groupid = null
我试图通过
分配控件IDtest.ID =“name”+ i.ToString;
我将继续为每个循环增加值。我也试试
test.ID = this.UniqueID +“name”+ i.ToString;
然而它不起作用。
答案 0 :(得分:0)
在调用Page.LoadViewState方法之前,必须在某处重新创建动态创建的控件。最好的地方是Page_Init。否则,当页面将尝试为这些控件加载viewstate时,它将找不到它们(因为它们仍未创建)并且失败。
例如,您可以在会话中保存DDL所选项目值,并在从Page_Init
调用PopulateButtons时使用session参数作为参数