题
即时具有retreiving出动态创建的下拉列表的值的问题。所有的控件都在Page_Init部分创建。所述listItems中被当时从listItems中的阵列添加。 (对照被命名为相同的,所以应该是accessable到视图状态进行适当的设置。)
这里是试图检索值的函数:
protected void Eng98AssignmentComplete_Click(object sender, EventArgs e)
{
String myID = "0";
Page page = Page;
Control postbackControlInstance = null;
// handle the Button control postbacks
for (int i = 0; i < page.Request.Form.Keys.Count; i++)
{
postbackControlInstance = page.FindControl(page.Request.Form.Keys[i]);
//Response.Write(page.Request.Form.Keys[i].ToString());
if (postbackControlInstance is System.Web.UI.WebControls.Button)
{
myID = Convert.ToString(
postbackControlInstance.ID.Replace("button_", ""));
}
}
String txtholder = "ctl00$ContentPlaceHolder$Eng098Instructors_" + myID;
Response.Write("MYID: " + myID + "<br/>");
DropDownList ddInstructorCheck = (DropDownList)Page.FindControl(txtholder);
Response.Write("Instructor Selected: "
+ ddInstructorCheck.SelectedValue + "<br/>");
}
这里是输出I得到,没有将其选择的讲师物质.....
MYID: 1_1
Instructor Selected: 0
ctl00$ContentPlaceHolder$Eng098Instructors_1_1
控件的名称是正确的(通过查看源验证)....
想法?
解决方案 8
我有2个渔获....这里的是什么。
1. I didn't clear the table I was adding to before re-creating the controls.
显然我对细节的关注是关昨天,我敢肯定的控制ctlXX领跑者是在回发了一些不同的数字,由于我是如何重新创建控件。
2. I was assigning the same list to all the dropdownlist controls.
一旦我呼吁每个创建的查找一个下拉列表控制,所有效果很好。
反正它的价值......
其他提示
您打算大量的工作来建立这个花哨的字符串:
ctl00 $ $的ContentPlaceHolder Eng098Instructors_1_1
这是你的控制的客户端ID ,而不是服务器ID。此代码是在服务器端运行,所以你需要服务器ID。要使用服务器ID获取控制,你需要这样做:
ContentPlaceHolder.FindControl("Eng08Instructors_1_1");
注意我没有看在该网页,因为您的内容占位符创建新的命名容器。
此外,你的循环设置了myID
变量的方式会的总是的最终按下按键集合中的最后的按钮。为什么即使在循环费心呢?
根据您的意见
,更好的方法来找到下拉列表的id是这样的:
string id = ((Control)sender).ID.Replace("button_", "Eng098Instructors_");
为什么不直接保存控制在你的类的实例,这样你就不必使用的FindControl?
你还回发时重新创建控件?动态生成/添加的控件必须与每个请求重新创建,它们不会自动重新创建。
你为什么不投发件人?这应该是引起回发的按钮:
string myId = "0";
Button btn = sender as Button;
if (btn != null)
myId = btn.ID
...
您需要,因为UniqueID属性是的Request.Form的关键在于执行这样的事情。
List<Button> buttons = new List<Button>();
List<DropDownList> dropdowns = new List<DropDownList>();
foreach (Control c in Controls)
{
Button b = (c as Button);
if (b != null)
{
buttons.Add(b);
}
DropDownList d = (c as DropDownList);
if (d != null)
{
dropdowns.Add(d);
}
}
foreach (String key in Request.Form.Keys)
{
foreach (Button b in buttons)
{
if (b.UniqueID == key)
{
String id = b.ID.Replace("button_", "");
String unique_id = "ctl00$ContentPlaceHolder$Eng098Instructors_" + id;
Response.Write("MYID: " + id + "<br/>");
foreach (DropDownList d in dropdowns)
{
if (d.UniqueID == unique_id)
{
Response.Write("Instructor Selected: " + d.SelectedValue + "<br/>");
break;
}
}
}
}
}
我不知道你为什么在生成代码的控制(你仍然可以添加项目动态,如果你这样做),但生成控件的代码可能会是一个巨大的帮助在这里。我猜你是不是设置列表项的值,而不是仅仅设置列表项文本。尝试看到你从SelectedText领域得到了什么,并发表您的控件创建功能。
编辑: 在回答关于@马丁的文章发表的留言,你说:“是的,我每次页面创建(初始或回传)时重新创建控件在Page_Init函数”。你是否还设置选择的值,当你创建它们?
您也可以使用,即使你的数据来自数据库中的网页上的控件,该控件本身确实有不被动态生成。
这个怎么样?
((Button)sender).Parent.FindControl(myid)
编辑:我误解你的问题。但我认为你应该遵循页面生命周期。它是动态创建的控件常见的问题。
我做了一些研究,这里是了解动态创建的控件可以帮助你...