【问题标题】:How to return DropDownList selections dynamically in ASP.NET?如何在 ASP.NET 中动态返回 DropDownList 选择?
【发布时间】:2010-04-10 05:21:07
【问题描述】:

这可能是一个简单的问题,但我正在使用 DropDownList 用 C# 开发一个 Web 应用程序。目前它只适用于一个 DropDownList。但是现在我修改了代码,使应该出现的 DropDownLists 的数量是动态的,它给了我错误;

"名称 'ddl' 不存在于 当前上下文。”

出现此错误的原因是 'ddl' = number of counters 的多个实例。那么我该如何返回多个“ddl”呢?比如这个方法应该有什么返回类型?以及如何返回这些值?

我需要动态的原因是我需要为他们选择的 Adventureworks 表中的每一列创建一个 DropDownList。

      private DropDownList CreateDropDownLists()
    {
        for (int counter = 0; counter < NumberOfControls; counter++)
        {
            DropDownList ddl = new DropDownList();
            SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable);
            ddl.ID = "DropDownListID" + (counter + 1).ToString();

            int NumControls = targettable.Length;
            DataTable dt = new DataTable();
            dt.Load(dr2);

            ddl.DataValueField = "COLUMN_NAME";
            ddl.DataTextField = "COLUMN_NAME";
            ddl.DataSource = dt;
            ddl.ID = "DropDownListID 1";
            ddl.SelectedIndexChanged += new EventHandler(ddlList_SelectedIndexChanged);
            ddl.DataBind();

            ddl.AutoPostBack = true;
            ddl.EnableViewState = true; //Preserves View State info on Postbacks
            //ddlList.Style["position"] = "absolute";
            //ddl.Style["top"] = 80 + "px";
            //ddl.Style["left"] = 0 + "px";
            dr2.Close();
        }
        return ddl;
    }

【问题讨论】:

    标签: c# visual-studio-2008 drop-down-menu


    【解决方案1】:

    看起来您正试图在函数末尾返回下拉菜单,但它是在 for 循环范围内声明的。尝试在函数的开头(在 for 循环之前)创建一个下拉数组,并将数组设置在循环内,然后返回它。您还需要更改函数声明以支持下拉列表。

    private DropDownList[] CreateDropDownLists()
    {
        DropDownList[] dropDowns = new DropDownList[NumberOfControls];
    
        for (int counter = 0; counter < NumberOfControls; counter++)
        {
            DropDownList ddl = new DropDownList();
            SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable);
            ddl.ID = "DropDownListID" + (counter + 1).ToString();
    
            int NumControls = targettable.Length;
            DataTable dt = new DataTable();
            dt.Load(dr2);
    
            ddl.DataValueField = "COLUMN_NAME";
            ddl.DataTextField = "COLUMN_NAME";
            ddl.DataSource = dt;
            ddl.ID = "DropDownListID 1";
            ddl.SelectedIndexChanged += new EventHandler(ddlList_SelectedIndexChanged);
            ddl.DataBind();
    
            ddl.AutoPostBack = true;
            ddl.EnableViewState = true; //Preserves View State info on Postbacks
            //ddlList.Style["position"] = "absolute";
            //ddl.Style["top"] = 80 + "px";
            //ddl.Style["left"] = 0 + "px";
            dr2.Close();
    
            dropDowns[counter] = ddl;
        }
        return dropDowns;
    }
    

    【讨论】:

    • 很好的答案!我使用了这个解决方案,凯文!
    【解决方案2】:

    为什么不只返回一个 DropDownList 列表?

    private List<DropDownList> CreateDropDownLists()
    {
        List<DropDownList> listDDL = new List<DropDownList>();
        for (int counter = 0; counter < NumberOfControls; counter++)
        {
            DropDownList ddl = new DropDownList();
    
            SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable);
            ddl.ID = "DropDownListID" + (counter + 1).ToString();
    
            int NumControls = targettable.Length;
            DataTable dt = new DataTable();
            dt.Load(dr2);
    
            ddl.DataValueField = "COLUMN_NAME";
            ddl.DataTextField = "COLUMN_NAME";
            ddl.DataSource = dt;
            ddl.ID = "DropDownListID 1";
            ddl.SelectedIndexChanged += new EventHandler(ddlList_SelectedIndexChanged);
            ddl.DataBind();
    
            ddl.AutoPostBack = true;
            ddl.EnableViewState = true; //Preserves View State info on Postbacks
            //ddlList.Style["position"] = "absolute";
            //ddl.Style["top"] = 80 + "px";
            //ddl.Style["left"] = 0 + "px";
            dr2.Close();
    
            listDDL.Add(ddl);
        }
        return listDDL;
    }
    

    【讨论】:

    • 作为最佳实践,您可以将 DataReader 放在 using 块中。
    • 很好的答案,约翰。比我拥有的更好!
    • @salvationishere 技术上是我的,john 只是清理了格式。 @Ashish 好点,我只想指出可以使用列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多