即时具有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)

编辑:我误解你的问题。但我认为你应该遵循页面生命周期。它是动态创建的控件常见的问题。

我做了一些研究,这里是了解动态创建的控件可以帮助你...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top