2012-11-27 54 views
0

我編程在C#中我需要把一些事情在一個字符串「XML」指數越界

我有以下代碼

 TextBox[] myTextBoxes = new TextBox[] { this.textBox2, this.textBox3, this.textBox4, this.textBox5, this.textBox6, this.textBox7, this.textBox8, this.textBox9, this.textBox10, this.textBox11 }; 
     TextBox[] ValueBoxes = new TextBox[] { this.textBox3, this.textBox5, this.textBox7, this.textBox9, this.textBox11 }; 
     CheckBox[] myCheckBoxes = new CheckBox[] { this.checkBox2, this.checkBox4, this.checkBox6, this.checkBox8, this.checkBox10 }; 
     CheckBox[] myMandBoxes = new CheckBox[] { this.checkBox3, this.checkBox5, this.checkBox7, this.checkBox9, this.checkBox11 }; 

和驗證某些條件,我有

xml += "<fields>"; 

     for (int i = 0; i < myTextBoxes.Length; i++) 
     { 
      if (string.IsNullOrWhiteSpace(myTextBoxes[i].Text)) 
      { 
       if (myCheckBoxes[i].Checked == true) 
        xml += "<field display='yes'> "; 
       else 
        xml += "<field display='no'> "; 
       if (myMandBoxes[i].Checked == true) 
        xml += "<mandatory='yes'>"; 
       else 
        xml += "<Mandatory='no'>"; 
       xml += "<label>" + (string)myTextBoxes[i].Text + "</label>"; 

      } 
     } 

它讓我在如果Indexoutof boud異常(myCheckBoxes [I] .Checked ==真)

我怎麼能解決此問題

+0

「myTextBoxes」中的文本框比'myCheckBoxes'中的複選框更有效 – jeroenh

+1

你說你是'用C++編程',但是你可以將代碼片段和標籤添加爲[C#]。 –

+0

你的設計對我來說似乎很奇怪。你能解釋你的要求嗎?我懷疑正確使用DataBinding將會更具可讀性和維護性。爲什麼不在.NEt框架中使用XmlWriter或任何Xml類?這將更加強大 –

回答

0

您沒有與文本框相同數量的複選框,因此您無法使用相同的索引訪問它們。 您的索引從0開始到myTextBoxes.Length,如果i將大於4,那麼您將得到此例外。

不確定你要做什麼,但是你可以在訪問myCheckBoxes中的元素之前添加一個長度檢查。

if (i < myCheckBoxes.Length && myCheckBoxes[i].Checked == true) 
     xml += "<field display='yes'> "; 
+0

我知道原因,但無法通過代碼 – user1838130

0

使用的foreach代替

這裏編輯爲myTextBoxes.Length - 1

for (int i = 0; i < myTextBoxes.Length - 1; i++) 

編輯:

而且您的複選框計數和Textox數不相符

+1

以編程方式解決這個問題你確定第10個元素存在於複選框列表中嗎? –

2

你的數組中有不同數量的元素,所以你不能通過使用相同的索引來訪問它們。他們將不得不獨立完成。

+0

你可以引用如何 – user1838130

+0

myMandBoxes和myCheckBoxes都有相同數量的項目,每個5,但myTextBoxes有更多。在for循環中,您使用的是myTextBoxes中的項目數量,因爲它的數量更多,所以一旦迭代次數超過5次,myCheckBoxes中就沒有更多項目,因此您會遇到越界異常。這可以嗎? – Ric

0

您的for循環運行到myTextBoxes.length,但您正在遍歷myCheckBoxes。看來你有更多的textboxesCheckBoxes

將其更改爲:

的for(int i = 0;我< myCheckBoxes.Length;我++){

0

而不是

for (int i = 0; i < myTextBoxes.Length; i++) 

使用

for (int i = 0; i < myCheckBoxes.Length; i++) // or myMandBoxes.Length (Both the CheckBoxes have same items) 

因爲您正在使用CheckBox循環,所以爲什麼需要一定長度的TextBox。

0

您的文本框有11個元素,而複選框有5個元素。

更改以下

if (string.IsNullOrWhiteSpace(myTextBoxes[i].Text)) 

if (string.IsNullOrWhiteSpace(myTextBoxes[i].Text) && i < myCheckBoxes.Length) 
0

首先,用循環施工時他們從不使用+ =的字符串,他們是immutable,並用這種方式,它只是一個浪費速度和記憶。改爲使用StringBuilder實例。

至於你的問題,所述myTextBoxes陣列的長度是10,所以你到9具有索引0的項目的代碼在此行

if (myCheckBoxes[i].Checked == true) 

嘗試訪問myCheckBoxes陣列中的相應的項目有5個元素(索引0到4)。當i變成5時,代碼訪問不存在的myCheckBoxes[5],因此是例外。

除此之外,textBox2checkBox7是控件的簡單名稱,在.net Framework for XML序列化和生成中有更好的選項。

+0

僅當串聯字符串的數量達到某個閾值時纔會出現StringBuilder優勢(不記得是哪個)。當它很低時,簡單的連接是可以接受的(如果它是假設的!) –

+1

關於字符串vs字符串生成器,http://www.codeproject.com/Articles/6771/String-Vs-StringBuilder-C。在任何情況下,StringBuilder都不好用。 – Tilak

+0

對不起,我的意思是指定在這種情況下不應該使用+ =(這個問題非常適用於StringBuilder用法:)將進行編輯。 – SWeko