我正在获取indexoutofrangeexception(请参阅下面代码中生成错误的行的---->指针)。该程序循环遍历数据集表中的标题和行项记录。表格有关系。我的示例数据有2个标题,每个标题有2行。 progam有两个循环,第一个循环遍历标题记录,第二个循环遍历标题的子记录。
该计划的一部分:
// ***** 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 :(得分:2)
这是因为您创建了一个包含0个元素的数组,并尝试在位置0上插入一个元素。这不起作用。您可以通过声明大小为1的数组来开始修复它:
// Create an array for lineitems
taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[1];
但是,动态调整数组大小并不是惯用的.NET方式。您可以使用List<T>
来处理为您调整大小的问题,并为您提供更清晰的代码以及可能更好的性能。
答案 1 :(得分: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;
编辑:既然问题已经解决了,那就是更好的实施。
数组是固定大小的,调整数组大小是一项昂贵的操作(基本上它需要创建一个新大小的副本)。通常你会在识别出性能瓶颈后使用它们。在大多数情况下,使用List会好得多。
我建议更改此行:
// 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.
}
按索引访问特定项目将是:
lineitems.Item(i); // get the ith item in the list.
答案 2 :(得分:0)
您似乎试图通过设置值来增加数组的大小,就像在JavaScript中一样。 C#数组不是那样的。您需要以完成后希望它们的大小创建它们。
或者,您可以使用List
对象,使用Add()方法将新内容放入列表中。
答案 3 :(得分:0)
lineitems
显然与dtrHDR.GetChildRows("HdrLine")
返回的行集合的大小不同。您正在创建一个零元素数组,然后尝试索引它。如果您希望它与dtrHDR.GetChildRows("HdrLine")
的大小相匹配,那么您需要先调用它并在获得计数后初始化数组。
为什么不使用List<T>
而只是将项目推送到它上,而不是使用数组?无需担心IndexOutOfRange
例外情况。
答案 4 :(得分:0)
您需要先将数组初始化,然后再将任何内容放入其中。首先打电话给.resize。
答案 5 :(得分:0)
这些行是问题
int ln;
ln = 0;
// Create an array for lineitems
taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln];
您创建0个元素的表。
答案 6 :(得分:0)
您的计划中有一个错误的错误:
int ln = 0
.
.
.
taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[] lineitems = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert[ln];
.
.
.
lineitems[ln] = jel;
您正在初始化一个包含0个元素的数组,然后尝试将第一个元素(element [0])设置为一个值。