繁体   English   中英

通过自定义属性选择一个控件

[英]Select a control by custom property

我已经尝试了一段时间,但是我想修改特定控件的value而不用循环遍历所有控件来检查文本框的id属性是否匹配正确的值。

目前这是我的代码,但是我认为也许使用LINQ会更高效;

for (int i = 0; i < protectMaxPlayers; i++)
{
    // Update the protect time.
        protect.setProtectTime(i, protect.getProtectTime(i) - 1);

        // Set the progressbar.
        foreach (ProtectProgressBar pb in pnlProtect.Controls.OfType<ProtectProgressBar>())
        {
            if (pb.Id == i)
                    pb.Value = protect.getProtectTime(i);
                }
        }
}

这会遍历所有进度条,以便找到正确的进度条。 这有可能变得更短吗?

提前致谢。

LINQ还将遍历ProgressBar的整个集合 ,因此它并没有比您当前的解决方案更好。

您应该考虑准备Dictionary<string, ProtectProgressBar>并使用其ID来找到正确的Dictionary<string, ProtectProgressBar>

var bars = pnlProtect.Controls.OfType<ProtectProgressBar>().ToDictionary(c => c.Id, c => c);

for (int i = 0; i < protectMaxPlayers; i++)
{
    // Update the protect time.
    protect.setProtectTime(i, protect.getProtectTime(i) - 1);

    ProtectProgressBar bar;
    if(bars.TryGetValue(i, out bar))
    {
        bar.Value = protect.getProtectTime(i);
    }
}

Dictionary<TKey, TValue>查找是在O(1)时间中完成的,因此比您当前的解决方案更好。

要完成此任务,您必须:

在上方导入Linq名称空间。

import System.Linq;

然后使用如下代码:

for (int i = 0; i < protectMaxPlayers; i++)
{
    // Update the protect time.
    protect.setProtectTime(i, protect.getProtectTime(i) - 1);

    // Set the progressbar.
    ProtectProgressBar pb = pnlProtect.Controls.OfType<ProtectProgressBar>().ToList().Find(k => k.ID == i.ToString());

    // check if it was found
    if (pb != null)
    {
        // your code
    }
}

问候,威廉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM