用数组定义和填充表格单元格

本文关键字:表格 单元格 填充 数组 定义 | 更新日期: 2023-09-27 17:54:04

我试图定义一个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:指数在数组的边界之外

我做错了什么?有更好的方法吗?任何评论都会很有帮助!

EDIT: tc[3]改为tc[2]EDIT2:张贴完整代码

用数组定义和填充表格单元格

for循环中的条件没有意义。对于包含三个元素的数组,它只运行两次。因此,数组中的第三个元素(tc[2])是null,因为它从未获得分配给它的值。第二个循环也是如此。

用这个代替:

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

BTW:你的例子的最后一行将抛出一个异常:

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到8tc[9]试图访问9的数组中的第10个元素!要解决这个问题,将数组的大小增加到10:

TableCell[] tc = new TableCell[10];

此外,您的TableRow数组也有同样的问题,因此您也应该增加它的大小:

TableRow[] tr = new TableRow[5];

如果我错了请纠正我,但是当您创建数组:

TableCell[] tc = new TableCell[3]

你有元素:

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

你不能赋值给tc[3]。
另外,为什么要制作长度为- 1的循环?