1

我在从动态创建的下拉列表中检索值时遇到问题。所有控件都在 Page_Init 部分中创建。列表项也是从列表项数组中添加的。(控件的名称相同,因此应该可以访问视图状态以进行适当的设置。)

这是尝试检索值的函数:

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/>");
}

这是我得到的输出,无论选择了哪个讲师.....

MYID: 1_1
Instructor Selected: 0
ctl00$ContentPlaceHolder$Eng098Instructors_1_1

控件的名称是正确的(通过查看源验证)....

想法?

4

8 回答 8

3

你需要做很多工作来构建这个花哨的字符串:

ctl00$ContentPlaceHolder$Eng098Instructors_1_1

那是您的控件的客户端 ID,而不是服务器 ID。此代码在服务器端运行,因此您需要服务器 ID。要使用服务器 ID 获得该控制,您需要执行以下操作:

ContentPlaceHolder.FindControl("Eng08Instructors_1_1");

请注意,我没有查看页面,因为您的内容占位符创建了一个新的命名容器。

此外,您的循环设置方式myID始终保持在 Keys 集合中的最后一个按钮。为什么还要为循环而烦恼?


根据您的评论,找到下拉列表 id 的更好方法是这样的:

string id = ((Control)sender).ID.Replace("button_", "Eng098Instructors_");
于 2009-09-28T18:45:12.327 回答
1

为什么不将控件保存在类中的实例中,这样您就不必使用 FindControl?

于 2009-09-28T18:36:51.757 回答
1

您是否还在回发期间重新创建控件?每个请求都必须重新创建动态生成/添加的控件,它们不会自动重新创建。

于 2009-09-28T18:37:44.983 回答
1

你为什么不投寄件人?这应该是导致回发的按钮:

string myId = "0";
Button btn = sender as Button;
if (btn != null)
    myId = btn.ID
...
于 2009-09-28T20:03:40.893 回答
1

您需要执行类似的操作,因为 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;
                        }
                    } 
                }
            }   
        }
于 2009-09-28T20:17:34.060 回答
0

我不确定您为什么要在代码中生成控件(如果这样做,您仍然可以动态添加项目),但是生成控件的代码在这里可能会有很大的帮助。我猜你没有设置列表项的值,而只是设置了列表项的文本。尝试查看您从 SelectedText 字段中获得的内容并发布您的控件创建功能。

编辑:在回复您对@Martin 帖子的评论时,您说“是的,每次创建页面(初始或回发)时,我都会在 Page_Init 函数中重新创建控件”。创建它们时是否还设置了选定的值?

即使您的数据来自数据库,您也可以在页面上使用控件,控件本身不必动态生成。

于 2009-09-28T18:35:57.960 回答
0

这个怎么样?

((Button)sender).Parent.FindControl(myid)

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

我做了一些研究,这里有一些关于动态创建控件的信息可以帮助你......

于 2009-09-28T20:48:58.270 回答
0

我有 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.  

一旦我将每次创建时的查找称为下拉列表控件,一切正常。

无论如何它的价值....

于 2009-09-29T15:00:37.223 回答