2014-01-24 80 views
0

我得到誤差作爲外:類型System.IndexOutOfRangeException'的未處理的異常發生在APP.EXE指數邊界C#

其他信息:索引陣列的邊界之外。

通過使用下面的代碼,我感謝您的幫助提前所有。

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; 
} 
+1

爲什麼'C'標籤這個問題? – sujin

+1

您需要調試它並檢查哪個數組不返回任何元素。拆分你的代碼並檢查它。 – Tsikon

+0

可用2 = ...的行只是很長。將它分成幾部分。 – PMF

回答

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]; 
    } 
} 
1

你在嘲笑樣式總是包含「display」,顯然它沒有。更換你的索引調用一起FirstOrDefault()調用偏移量爲0,則測試空:

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

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

我也建議檢查'Split(':')'是否也返回多個項目 –

+0

。這裏學到的教訓是,在索引數組之前,您需要檢查數組的長度 - 通過'length>#'屬性或使用'FirstOrDefault'並測試null。 – Moho

+0

我剛纔指出你也應該添加該部分的驗證。 –

1

兩種可能性:

  1. ToArray()返回空array.You嘗試這是不存在的元素。
  2. Split(':')返回一個元件。

Debug您的代碼,並找到哪一個是真的。

看來你並不需要ToArray。剛使用FirstOrDefault,並檢查返回結果是否爲空或not.If它不是呼叫Split並再次檢查,以防止異常。

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

if(Available2 != null) 
{ 
    var text = Available2.Split(':'); 
    if(text.Length > 1) 
    { 
     var result = text[1]; 
    } 
} 
+0

我想'ToArray()'應該返回空數組,如果序列是空的。與拆分相同。此外,如果要麼返回'null',我們將'NullReferenceException'而不是'IndexOutOfRange' –

+0

此外,如果返回'null',則會發生'NullReferenceException'。 –

+1

你沒錯。我真的需要睡覺一下:( –

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

兩種可能的問題:

要麼ToArray()確實與點訪問元件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]; 
} 
0

Available2 = wb.Document.GetElementById( 「ContentPlaceHolder1_reqTxt」)Style.Split( ';')其中(x => x.Contains(「顯示「))。ToArray的()[0]。分割( ':')[1];

要查找問題,decomposite到:

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();