指数超出了C#的范围

时间:2014-01-24 11:30:58

标签: c#

我收到错误:app.exe中发生了'System.IndexOutOfRangeException'类型的未处理异常

其他信息:索引超出了数组的范围。

使用下面的代码,我非常感谢您的帮助。

public string  getMissingFields(WebBrowser wb, DataRow dr)
{
    string Available2 = "";
    Available2 = wb.Document.GetElementById("ContentPlaceHolder1_reqTxt")
                  .Style.Split(';')
                  .Where(x => x.Contains("display"))
                  .ToArray()[0].Split(':')[1];

    string FieldsMissing="";
    if( Available2 .Contains( "inline" )) {
          FieldsMissing = FieldsMissing + "First name missing!" + ", ";
    }
    return FieldsMissing;
}

5 个答案:

答案 0 :(得分:1)

你觉得风格总是包含“显示”,显然它没有。通过调用FirstOrDefault()将索引器调用替换为偏移量0,然后测试null:

Available2 = wb.Document.GetElementById("ContentPlaceHolder1_reqTxt").Style.Split(';').Where(x   => x.Contains("display")).ToArray().FirstOrDefault();

if( null != Available2 )
{
    // continue
}

答案 1 :(得分:1)

两种可能性:

  1. ToArray()返回空数组。你正在尝试一个不存在的元素。
  2. Split(':')返回一个元素。
  3. Debug您的代码并找到哪一个是真的。

    您似乎不需要ToArray。只需使用FirstOrDefault,并检查返回结果是否为null。如果不是 null ,请调用{{1并再次检查以防止异常。

    Split

答案 2 :(得分:1)

Available2 = wb.Document.GetElementById("ContentPlaceHolder1_reqTxt")
              .Style.Split(';')
              .Where(x => x.Contains("display"))
              .ToArray()[0].Split(':')[1];

两个可能的问题:

ToArray()确实返回一个空数组,at点访问元素0会导致此错误。或者它正处于您在索引1处访问元素的位置 - 可能没有这样的元素,因为在您尝试拆分的字符串中没有:?调试代码或确保ToArray()返回至少一个元素,Split返回两个元素。

你现在可以试试。这会拆分您的代码,以便您可以轻松调试:

var items = wb.Document.GetElementById("ContentPlaceHolder1_reqTxt")
              .Style.Split(';')
              .Where(x => x.Contains("display"))
              .ToArray();

if (items.Count > 0)
{
    string[] split = items[0].Split(':');
    if (split.Length > 1)
        Available2 = split[1];
}

答案 3 :(得分:0)

首先,考虑一下id=ContentPlaceHolder1_reqTxt无法控制:

var reqTxt = wb.Document.GetElementById("ContentPlaceHolder1_reqTxt");

您必须处理null

的情况
if(reqTxt != null)
{

}

现在考虑没有样式display,然后ToArray返回一个空数组。您可以使用FirstOrDefault并检查null收益:

string Available2  = null;
if(reqTxt != null)
{
    var firstDisplayStyle = reqTxt.Split(';')
        .FirstOrDefault(s => s.Contains("display"));
    if(firstDisplayStyle != null)
    {
        string[] displaySplit = firstDisplayStyle.Split(':');
        // now handle the case that there is no colon:
        if(displaySplit.Length > 1)
            Available2 = displaySplit[1];
    }
}

答案 4 :(得分:0)

Available2 = wb.Document.GetElementById(“ContentPlaceHolder1_reqTxt”)。Style.Split(';')。Where(x => x.Contains(“display”))。ToArray()[0] .Split( ':')[1];

要找到问题,请分解为:

if (wb == null || wb.Document == null )
   return;

var element = wb.Document.GetElementById("ContentPlaceHolder1_reqTxt");
if (element == null || element.Style == null)
   return;

var displayItems = element.style.Split(';').Where(x=> x.Contains("display")).FirstOrDefault();

if ( displayItems == null)
   return;

var colonItems = displayItems.Split(':');
if ( colonItems.Count() < 2 )
   return;

var Available2 = colonItems.Skip(1).First();