#c# #arrays #list #sharepoint
#c# #массивы #Список #sharepoint
Вопрос:
Я пытаюсь определить массив табличных ячеек, но возникли некоторые проблемы. Мой код выглядит следующим образом
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]);
}
}
}
Когда я пытаюсь запустить это на сайте, я получаю следующую ошибку:
Индекс находился за пределами массива.
Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: Система.Исключение IndexOutOfRangeException: индекс находился за пределами массива.
Что я делаю не так? Есть ли лучший способ сделать это? Любые комментарии были бы полезны!
ПРАВКА: tc [3] изменен на tc [2]
ПРАВКА 2: опубликован полный код
Комментарии:
1. Условиями должны быть либо
i < tc.Length
, либоi <= tc.Length - 1
.
Ответ №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]
пытается получить доступ к 10-му элементу в массиве из 9! Чтобы устранить эту проблему, увеличьте размер вашего массива до 10:
TableCell[] tc = new TableCell[10];
Кроме того, у вас такая же проблема с вашим TableRow
массивом, поэтому вам также следует увеличить его размер:
TableRow[] tr = new TableRow[5];
Комментарии:
1. Это был мой первоначальный цикл, однако всякий раз, когда я его использую, я получаю сообщение об ошибке: индекс находился за пределами массива.
2. В опубликованном вами коде это невозможно. В этом случае ваш реальный код и опубликованный вами код не совпадают…
3. Сейчас я опубликовал полный код, но все равно получаю ошибку index out of bounds. Похоже, не могу найти проблему.
4. Да, вы правы, конечно 🙂 Изменил элементы, и это работает отлично 🙂 Спасибо, Дэниел!
Ответ №2:
Поправьте меня, если я ошибаюсь, но при создании массива:
TableCell[] tc = new TableCell[3]
у вас есть элементы:
tc[0], tc[1], tc[2]
Вы не можете назначить tc[3].
Кроме того, почему вы создаете циклы с длиной — 1 ? Должно быть полной длины;
Комментарии:
1. Это была просто опечатка, там должно быть написано tc[2], а не tc[3]. Кроме того, я ввел -1 в цикл, потому что полученный мной индекс находился за пределами сообщения об ошибке массива 🙂