Определение и заполнение TableCells массивом? - PullRequest
0 голосов
/ 02 мая 2011

Я пытаюсь определить массив 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]);
        }

    }

}

Когда я пытаюсь запустить это на сайте, я получаю следующую ошибку:

Индекс находился за пределами массива.

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.IndexOutOfRangeException: индекс находился за пределами массива.

Что я делаю неправильно?Есть ли лучший способ сделать это?Любые комментарии будут полезны!

РЕДАКТИРОВАТЬ: tc [3] изменен на tc [2] РЕДАКТИРОВАТЬ 2: Опубликован полный код

Ответы [ 2 ]

1 голос
/ 02 мая 2011

Поправьте меня, если я ошибаюсь, но при создании массива:

TableCell[] tc = new TableCell[3]

у вас есть элементы:

tc[0], tc[1], tc[2]

Вы не можете назначить tc [3].
Кроме того, почему вы делаете петли с длиной - 1?Должно быть в полную длину;

1 голос
/ 02 мая 2011

Условие в вашем цикле for не имеет смысла. С массивом из трех элементов он запускается только два раза. Из-за этого третий элемент в вашем массиве (tc[2]) - null, потому что он никогда не получает присвоенное ему значение. То же самое касается вашего второго цикла.

Используйте это вместо:

for (int p = 0; p < tc.Length; p++)

Кстати: последняя строка вашего примера выдаст исключение:

setTableRow(tc[2], tc[3], tr[1]);

tc[3] - четвертый элемент в массиве из трех элементов. Это приведет к IndexOutOfRangeException.

UPDATE:
После того, как вы разместили свой полный код, я могу сказать следующее:

Следующие строки вызывают 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];
...