我正在尝试定义一个TableCell数组,但是遇到了一些问题。 我的代码如下
public partial class ShowGoalsUserControl : UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
SPWeb _web = SPContext.Current.Web;
SPList objGoalsList = _web.Lists["Goals"];
SPListItemCollection goalsItems = getItemsByQueryID(objGoalsList);
foreach (SPItem goalItem in goalsItems)
{
goalTitle.Text = "<h3>" + Convert.ToString(goalItem["Title"]) + "</h3>";
txtDescription.Text = Convert.ToString(goalItem["Description"]);
TableCell[] tc = new TableCell[9];
for (int i = 0; i < tc.Length; i++)
{
tc[i] = new TableCell();
}
tc[0].Text = "Status:";
setStatus(goalItem, tc[1], _web);
tc[2].Text = "Owner:";
SPFieldLookupValue thisOwner = getOwner(goalItem);
tc[3].Text = thisOwner.LookupValue;
tc[4].Text = "Perspective:";
SPFieldLookupValue thisPerspective = new SPFieldLookupValue(goalItem["Perspective"].ToString());
tc[5].Text = thisPerspective.LookupValue;
tc[6].Text = "Parent:";
SPFieldLookupValue thisParent = new SPFieldLookupValue(goalItem["Parent"].ToString());
tc[7].Text = thisParent.LookupValue;
tc[8].Text = "Deadline:";
tc[9].Text = Convert.ToString(goalItem["Deadline"]);
TableRow[] tr = new TableRow[4];
for (int p = 0; p < tr.Length; p++)
{
tr[p] = new TableRow();
}
setTableRow(tc[0], tc[1], tr[0]);
setTableRow(tc[2], tc[3], tr[1]);
setTableRow(tc[4], tc[5], tr[2]);
setTableRow(tc[6], tc[7], tr[3]);
setTableRow(tc[8], tc[9], tr[4]);
addToTable(tr);
}
}
SPListItemCollection getItemsByQueryID(SPList list)
{
SPQuery query = new SPQuery();
query.Query = "<Where><Eq><FieldRef Name='ID' /><Value Type='Text'>" + Request.QueryString["gid"] + "</Value></Eq></Where>";
SPListItemCollection items = list.GetItems(query);
return items;
}
void setStatus(SPItem item, TableCell status, SPWeb web)
{
string statusTest = Convert.ToString(item["Status"]);
switch (statusTest)
{
case "Approved":
status.Text = "<img src='" + web.Site.Url + "/_layouts/images/kpidefaultlarge-0.gif' height='10' width='10' />";
break;
case "Pending":
status.Text = "<img src='" + web.Site.Url + "/_layouts/images/kpidefaultlarge-1.gif' height='10' width='10' />";
break;
case "Declined":
status.Text = "<img src='" + web.Site.Url + "/_layouts/images/kpidefaultlarge-2.gif' height='10' width='10' />";
break;
}
}
SPFieldLookupValue getOwner(SPItem item)
{
SPFieldLookupValue getThisOwner = new SPFieldLookupValue(item["Owner"].ToString());
return getThisOwner;
}
void setTableRow(TableCell add1, TableCell add2, TableRow row)
{
row.Cells.Add(add1);
row.Cells.Add(add2);
}
void addToTable(TableRow[] tableRow)
{
for (int i = 0; i < tableRow.Length; i++)
{
infoTable.Rows.Add(tableRow[i]);
}
}
}
当我尝试在网站上运行时,我收到以下错误:
索引超出了数组的范围。
描述:期间发生了未处理的异常 执行当前的Web请求。 请查看堆栈跟踪了解更多信息 有关错误的信息和位置 它起源于代码。
异常详细信息:System.IndexOutOfRangeException:Index 超出了数组的范围。
我做错了什么?有没有更好的方法呢? 任何评论都会有所帮助!
编辑:tc [3]更改为tc [2] EDIT2:已发布完整代码
答案 0 :(得分:1)
for循环中的条件没有意义。使用三个元素的数组,它只运行两次。因此,数组中的第三个元素(tc[2]
)为null
,因为它永远不会为其分配值。你的第二个循环也是如此。
请改用:
for (int p = 0; p < tc.Length; p++)
顺便说一下:你的例子的最后一行会抛出异常:
setTableRow(tc[2], tc[3], tr[1]);
tc[3]
是三个项目数组中的第四个元素。这将产生IndexOutOfRangeException
。
<强>更新强>
在您发布完整代码后,我可以这样说:
以下行会导致IndexOutOfRangeException
:
tc[9].Text = Convert.ToString(goalItem["Deadline"]);
setTableRow(tc[8], tc[9], tr[4]);
您创建了一个包含9个元素的数组,即索引0到 8 。 tc[9]
尝试访问9的数组中的第10个元素!要解决该问题,请将数组的大小增加到10:
TableCell[] tc = new TableCell[10];
此外,您的TableRow
数组存在同样的问题,因此您也应该增加它的大小:
TableRow[] tr = new TableRow[5];
答案 1 :(得分:1)
如果我错了,请纠正我,但是当你创建数组时:
TableCell[] tc = new TableCell[3]
你有元素:
tc[0], tc[1], tc[2]
您无法分配到tc [3] 另外,为什么要制作长度为-1的循环?应该是全长;