【问题标题】:DropDownList Issue in Asp.net [closed]Asp.net 中的 DropDownList 问题[关闭]
【发布时间】:2014-09-30 12:26:21
【问题描述】:

如何在一个Collection的aspx页面中获取多个DropDownList的ID名称?

DropDownList ddl = new DropDownList();
    string s=ddl.ID;
    List<string> li = new List<string>();
    li.Add(s);

【问题讨论】:

  • 不清楚你的意思。您的代码似乎已成功将元素添加到列表中。你想做什么但不起作用?
  • 我想在 List(Collection) 中获取 DropDownLists 的所有 ID。此代码不起作用。最后获取空值。
  • 您正在创建一个新的 DropDownList 并检索 ID 属性(此时将为空)。你想做什么?您想找出一些现有 DDL 的 Id 吗?
  • 是的,你是对的。 DDL 已经存在于设计页面中。如果有 100 个 DDL,如何在 List 中获取现有 DDL 的 ID? @BenRobinson
  • @user2096592:what 下拉列表的所有 ID?您只是在问如何引用页面上的控件吗?这些应该是 Page 对象上的类级成员,除非它们是动态创建的,或者是某些转发器控件的一部分或类似的东西。你需要更具体。现在,您显示的代码完全符合我们的预期。它创建一个新的DropDownList(没有默认的ID 值),然后将ID 值添加到List

标签: c# asp.net collections


【解决方案1】:

根据对另一个问题的评论,我理解您的问题是您已向页面添加了控件,现在您想将所有控件都读回来。为此,您需要递归读取页面上的所有控件并找到 DropDownList 类型的控件,类似于以下内容:

protected void Page_Load(object sender, EventArgs e)
{
    var dropdownListIds = new List<string>();
    var allControls = GetControlsRecursively(this);
    foreach (var ctrl in allControls)
    {
        var ddl = ctrl as DropDownList;
        if (ddl != null)
        {
            dropdownListIds.Add(ddl.ID);
        }
    }
}

private List<Control> GetControlsRecursively(Control parent)
{
    var allControls = new List<Control>();
    foreach (Control child in parent.Controls)
    {
        allControls.Add(child);
        allControls.AddRange(GetControlsRecursively(child));
    }
    return allControls;
}

【讨论】:

    【解决方案2】:

    您能告诉我如何获取列表中现有 DDL 的 ID 吗?假设有 100 个 DDls

    你有几个选择...

    1. 分别获取每个控件的 ID
    2. 循环遍历Controls 集合并测试每个元素是否为DropDownList 类型
    3. 将控件存储在集合中并从该集合中选择 ID

    第一个选项是最直接的,如果你只需要做一次,那么它可能是最简单的:

    var list = new List<string>();
    list.Add(dropDownList1.ID);
    list.Add(dropDownList2.ID);
    list.Add(dropDownList3.ID);
    list.Add(dropDownList4.ID);
    // etc...
    

    第二个选项是最少的代码,但也是最不可靠的。它可能看起来像这样:

    var list = new List<string>();
    foreach (var control in Controls)
        if (control is DropDownList)
            list.Add((control as DropDownList).ID);
    

    但是,这将获得作为Controls 集合的直接元素的控件。如果它们中的任何一个嵌套在其他控件中,则可能找不到它们。你可以让它更递归地解决这个问题,但这只会使它更脆弱和更容易出错。

    如果您要多次查询DropDownList 控件列表,第三个选项可能是最好的。您在这里所做的实质上是在页面的类级别静态创建控件列表。像这样的:

    private List<DropDownList> MyDropDownLists { get; set; }
    
    // the page constructor
    public MyPage()
    {
        MyDropDownLists.Add(dropDownList1);
        MyDropDownLists.Add(dropDownList2);
        MyDropDownLists.Add(dropDownList3);
        MyDropDownLists.Add(dropDownList4);
        // etc...
        // You might even extract all of this into a CollectDropDownLists function
    }
    

    那么任何时候您需要查询该列表,您都可以轻松完成:

    var listOfIDs = MyDropDownLists.Select(d => d.ID);
    

    【讨论】:

    • 谢谢...我选择第二个选项,我可以计算控件的总数,但无法获取 DDL 的 ID
    • @user2096592:如答案所述,第二个选项是最不可靠的。它会“工作”,因为您可以从 Controls 集合的直接子代中获取 IDs,但对于更复杂的控制层次结构来说,它不是很健壮。如果您只需要查询一次值,我仍然推荐第一个选项,如果您必须多次查询值,我仍然推荐第三个选项。
    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多