0

我正在开发一个应用程序,通过检查是否显示特定单词来检查网站是否启动。在提供的代码中,我制作了一个图像(如果网站启动则为绿色,如果关闭则为红色),但是当计时器再次检查网站时,我必须删除此图像。我收到以下错误StkPan_Icons.Children.RemoveAt(RefNum);

指定的参数超出了有效值的范围。

有什么帮助吗?

private void ClearImageStack(int RefNum)
{
    StkPan_Icons.Children.RemoveAt(RefNum);
}


private void GetSiteAndCompare(int URL_Num)
{
    using (var Client = new WebClient())
    {
        string SiteContent = Client.DownloadString("http://" + UrlArrary[URL_Num]);

        if (SiteContent.Contains(CheckForArray[URL_Num]))
        {
            StkPan_Icons.Children.Insert(URL_Num, GetGreen());
            FailRefArray[URL_Num] = false;
        }
        else
        {
            StkPan_Icons.Children.Insert(URL_Num, GetRed());
            Fail(URL_Num);
        }
    }
}

private void RunCheck()
{
    // Checks all the websites.
    for (int i = 0; i < URLCount; i++)
    {
        ClearImageStack(i);
        GetSiteAndCompare(i);
    }
4

2 回答 2

5

看起来您的循环逻辑对于编辑该集合没有意义。考虑一个简化的例子:

for (var i = 0; i < 3; i++)
    someCollection.RemoveAt(i);

如果someCollection最初有 3 个元素,则此代码将导致错误。它试图对集合执行以下操作:

  1. 删除索引 0 处的元素(集合现在有 2 个元素)
  2. 删除索引 1 处的元素(集合现在有 1 个元素)
  3. 删除索引 2 处的元素(错误:集合只有一个元素,没有索引 2

如果您只想清除集合(如函数名称所暗示的那样),则无需遍历其元素。它可能已经有一个.Clear()功能。尝试这样的事情:

StkPan_Icons.Children.Clear();
for (int i = 0; i < URLCount; i++)
    GetSiteAndCompare(i);
于 2013-06-11T18:43:27.603 回答
-2

有几个问题。您需要为 ClearImageStack 和调用它的方法添加边界检查。IE

private void ClearImageStack(int refNum)
{
    if (StkPan_Icons.Children.Count() <= refNum) // or .Length depending on the type
        StkPan_Icons.Children.RemoveAt(refNum);
    else
        throw new ArgumentException("Really, bitch?")
}

根本原因是 RunCheck 中的 URLCount 与 StkPan_Icons.Children.Count() 具有不同(更高)的值。这让我想知道你为什么不做类似的事情

private void RunCheck()
{
    // Checks all the websites.
    for (int i = 0; i < StkPan_Icons.Children.Count(); i++)
    {
        ClearImageStack(i);
        GetSiteAndCompare(i);
    }

    UpdateStatus();
}
于 2013-06-11T18:37:49.640 回答