2011-10-24 24 views
-1

私はindexoutofrangeexceptionを取得しています(コード内でエラーを生成する行のポインタは---->参照)。プログラムは、データセットテーブルのヘッダおよび明細レコードをループします。テーブルには関係があります。私のサンプルデータには2つのヘッダーがあり、それぞれ2行あります。プログラムには2つのループがあり、最初のループはヘッダーレコードをループし、2番目のループはヘッダーの子レコードをループします。プログラムのc#配列 - 範囲外の例外のインデックス

パート:

 // ***** PO Header and Line 

     int ln; 
     ln = 0; 

     // Create an eConnect PO Header node object 
     taGLTransactionHeaderInsert jeh = new taGLTransactionHeaderInsert(); 

     // Create an array for lineitems 
     taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln]; 

     foreach (DataRow dtrHDR in ds.Tables["Header"].Rows) 

     { 
      Array.Clear(lineitems, 0, ln); 

      jeh.BACHNUMB = "Sheraz"; 
      jeh.JRNENTRY = jenoint; 
      jeh.REFRENCE = dtrHDR["Reference"].ToString(); 
      jeh.SOURCDOC = dtrHDR["AvantisJE"].ToString(); 
      jeh.USERID = System.Environment.UserName; 
      jeh.TRXDATE = System.DateTime.Now.ToString(); 

      ln = 0; 

      foreach (DataRow dtrLine in dtrHDR.GetChildRows("HdrLine")) 

      { 

       // Populate the elements of the taPoLIne_ItemsTaPOLine XML node 
       taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert jel = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert(); 

       jel.BACHNUMB = jeh.BACHNUMB; 
       jel.JRNENTRY = jeh.JRNENTRY; 
       jel.ACTNUMST = dtrLine["GreatPlains"].ToString(); 
       jel.DEBITAMT = Convert.ToDecimal(dtrLine["Debit"].ToString()); 

       //Avantis Inv Trx Key 
       jel.ORDOCNUM = dtrLine["AvantisJE_Line"].ToString(); 
       // Avantis GL Trx Type 
       jel.ORTRXDESC = dtrLine["transactiontypename"].ToString(); 


       //Add POLine to an Array 
       lineitems[ln] = jel;  ----------------> I get an error here! 

       ln = ln + 1; 

       Array.Resize(ref lineitems, ln + 1); 

      } 

     } 
+0

はどのように[LN]あなたの配列 – Sandy

+0

taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert []のLineItems =新しいtaGLTransactionLineInsert_ItemsTaGLTransactionLineInsertを初期化しませんでした。 – Shazam

答えて

2

まだ存在しないインデックスにアクセスしています。

//Add POLine to an Array 
lineitems[ln] = jel;  ----------------> I get an error here! 
ln = ln + 1;  
Array.Resize(ref lineitems, ln + 1); 

あなたはに順序を変更する必要があります。

//Add POLine to an Array 
Array.Resize(ref lineitems, ln + 1); 
lineitems[ln] = jel;  ----------------> should be fixed, no error here! 
ln = ln + 1;  

EDIT:今、当面の問題は、より高度な実装までに、道の外であること。

配列は固定サイズであり、配列のサイズ変更は高価な操作です(基本的に新しいサイズのコピーを作成する必要があります)。典型的には、パフォーマンスボトルネックを特定した後にこれらを使用します。ほとんどの場合、リストを使用する方がはるかに良いでしょう。

// Create an array for lineitems 
taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = 
       new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln]; 

私はこの行を変更することをお勧めしたい

var lineitems = new List<taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert>(); 

し、それに追加するあなたは、単にそれらを反復するために

lineitems.Add(jel); 

を行うだろう:

for (var ln in lineitems) { 
// whatever you want to do with a line. 
} 
インデックスで特定のアイテムをacccessする

は次のようになります。

lineitems.Item(i); // get the ith item in the list. 
0

あなたがJavaScriptで行う可能性がありますように、値を設定することにより、配列のサイズを大きくしようとしていることが表示されます。 C#の配列はそうではありません。完了したら、あなたが望むサイズで作成する必要があります。

また、Listオブジェクトを使用して、Add()メソッドを使用して新しいコンテンツをリストに追加することもできます。

2

これは、要素が0の配列を作成し、要素を位置0に挿入しようとしたためです。これは機能しません。あなたはそもそも1のサイズの配列を宣言することで、それを修正することができます:

// Create an array for lineitems 
taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[1]; 

しかし、オンザフライで配列のサイズを変更すると、これを行うの慣用.NETの方法ではありません。 List<T>を使用すると、サイズ変更を処理し、よりクリーンなコードとパフォーマンスを得ることができます。

+0

はい、サイズが1の配列を宣言しました。私は今すぐリストを調べて、コードを少しきれいにすることができるかどうかを調べるつもりです。ありがとう! – Shazam

0

lineitemsは明らかにdtrHDR.GetChildRows("HdrLine")によって返された行コレクションと同じサイズではありません。ゼロ要素の配列を作成し、それにインデックスを作成しようとしています。 dtrHDR.GetChildRows("HdrLine")のサイズに一致させたい場合は、最初に呼び出してカウントを取得した後に配列を初期化する必要があります。

アレイを使用する代わりに、List<T>を使用して項目をプッシュするのはなぜですか?もうIndexOutOfRangeの例外を心配する必要はありません。

0

何かを入れる前に、配列を初期化する必要があります。 .resizeを最初に呼び出します。

0

これらの行は、あなたが0の要素のテーブルを作成し、問題

int ln; 
ln = 0; 

// Create an array for lineitems 
taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln]; 

です。

0

はあなたのプログラムにoff-by-oneエラーを持っている:あなたは、その後([0]要素)の値に最初の要素を設定しようとすると、0要素の配列を初期化している

int ln = 0 
    . 
    . 
    . 
    taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln]; 
    . 
    . 
    . 
    lineitems[ln] = jel; 

関連する問題