0

只是觉得我在这里浪费循环 = CPU 时间,并且想知道是否有办法优化这段代码,或者只是最小化它。

基本上,代码的作用是通过 editOkkInfo 控件中的每个控件。检查当前控件是否是一个文本框,如果是,那么它将执行一些操作,如果不是,它将跳转到下一个 if 语句。下一条语句检查我们是否计数了 14 次(因为我只有 14 个文本框),如果不是 14 次,则循环继续,如果计数为 14 次,则循环中断。

任何帮助表示赞赏,提前感谢,这里是代码,干杯。

iterate = 0;
foreach (System.Web.UI.Control ctrl in this.editOkkInfo.Controls)
{
    if (ctrl is TextBox)
    {
        tb = (TextBox)this.FindControl(ctrl.ClientID.ToString());
        tb.Text = dt.DefaultView[0][iterate++].ToString();
    }
    if (iterate == 14)
       break;
}
4

5 回答 5

3

无需使用FindControl,因为您已经拥有了控制权。只需投射它:

iterate = 0;

foreach (System.Web.UI.Control ctrl in this.editOkkInfo.Controls)
{
    if (ctrl is TextBox)
    {
        tb = (TextBox)ctrl;
        tb.Text = dt.DefaultView[0][iterate++].ToString();
    }

    if (iterate == 14)
        break;
}

额外的可读性改进将消除所有控件和is测试的循环:

foreach (TextBox ctrl in this.editOkkInfo.Controls)
{
    ctrl.Text = dt.DefaultView[0][iterate++].ToString();

    if (iterate == 14)
        break;
}
于 2012-11-22T11:23:20.723 回答
1

您可以通过转换 ctrl 变量来保存 FindControl() 解析:

tb = (TextBox) ctrl;
tb.Text = //...

而且,我们应该知道editOkkInfo.Controls是由代码创建还是在aspx页面中声明。如果前者为真,则可以将对此类对象的引用保存在变量中,然后使用它而不是循环。

于 2012-11-22T11:22:45.487 回答
1
if (ctrl is TextBox)
{
    tb = (TextBox)ctrl;
}

这应该足够了,您正在查看TextBoxusing FindControl,知道您拥有它。因此,您可以将控件转换为TextBox

于 2012-11-22T11:23:50.967 回答
0

我已经看到了一种更快的方法来查找特定类型的所有控件而不是循环。这似乎更有效率。 使用 linq 获取网页中特定类型的 web 控件列表 希望对 Milind 有所帮助

于 2012-11-22T11:43:34.833 回答
-2

我认为 foreach 一段时间更好,因为一段时间不会检查所有控件,直到数量为 14(可以或不检查所有控件,取决于!)

于 2013-04-22T15:09:04.163 回答