【问题标题】:Accessing programmatically created controls访问以编程方式创建的控件
【发布时间】:2014-01-13 13:49:35
【问题描述】:

我在一个占位符内创建了一系列面板,每个面板内有 5 个文本框。

按下按钮时,我想从每个文本框获取 .Text 以及面板的 ID。我计划使用 JaggedArray 来跟踪所有面板及其内部文本框。

    string[][] jaggesaddress = new string[stop][]; //stop is an int and equal to amount of panels on screen.
    String[] numbers = new String[stop];

    int a = 0;

    //Control ctrl;

    foreach (Control ctrl in BookingPlaceholder.Controls) //BookingPlaceholder is placehodler ID
    {
        if (ctrl is Panel)
        {
            numbers[a] = ctrl.ID;
            a++;
            //ctrl.ID = numbers[a];

            foreach(TextBox tb in ctrl.ID)  // error here
            {

            }
        }
    }

但是第二个 foreach 循环有一个错误,我不能 100% 确定如何克服这个问题。

“无法将类型 'char' 转换为 'System.Web.UI.WebControls.TextBox'”

我知道 numbers[a] 确实找到了第一个面板,但它是一个没有 ID 扩展名的字符串。

欢迎提出任何建议。

  • 乔什

【问题讨论】:

    标签: c# asp.net panel


    【解决方案1】:

    您的内部循环正在尝试遍历字符串。你想要的是……

    foreach(TextBox tb in ctrl.Controls.OfType<TextBox>())
    

    而不是

    foreach(TextBox tb in ctrl.ID)
    

    【讨论】:

    • Controls 不是TextBox 类型,这是错误的,请参阅@Bhavesh Kachhadiya 的回答。
    【解决方案2】:

    如果 PlaceHolder 中有更多通用控件可用,那么 你需要找到文本框控件。所以检查控件类型也是安全的。

    foreach (Control ctr in ctrl.Controls)
            {
                if (ctr is TextBox)
                {
                    //Do your things
                    // ((TextBox)ctr).Text 
                }
            }
    

    【讨论】:

    • @WillemDuncan 这个怎么样?
    • 这是正确的方法,甚至可以使用LINQ缩短:foreach(TextBox ctrl in crl.Controls.OfType&lt;TextBox&gt;()) { ... }
    • 是的,你是对的,但如果 OP 不使用 Linq,那么这是一种简单的方法。
    • @BobbleHead 这是因为在直接使用控件ctr之前,您需要将其转换为TextBox控件。请参阅我编辑的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多