2011-05-02 57 views
0

我想定义一个TableCell数组,但有一些问题。 我的代码如下使用数组定义和填充TableCells?

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]); 
     } 

    } 

} 

当我尝试到现场我收到以下错误上运行此:

  Index was outside the bounds of the array.

  Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

  Exception Details: System.IndexOutOfRangeException: Index was outside the bounds of the array.

我在做什么错?有没有更好的方法来做到这一点? 任何意见将有帮助!

编辑:TC [3]变更为TC [2] EDIT2:发布完整的代码

+0

条件应该是'我 2011-05-02 10:42:24

回答

1

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

使用这个代替:

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

BTW:你的榜样的最后一行将抛出一个异常:

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到。 tc[9]尝试访问9数组中的第10个元素!为了解决这个问题,提高您的数组的大小10:

TableCell[] tc = new TableCell[10]; 

此外,你有你的TableRow阵列同样的问题,所以你应该增加它的大小,也:

TableRow[] tr = new TableRow[5]; 
+0

这是我的原始循环,但是,我收到错误消息:每当我使用它时,索引都在数组边界之外。 – 2011-05-02 10:47:05

+0

这不适用于您发布的代码。在这种情况下,您的真实代码和您发布的代码不匹配... – 2011-05-02 10:50:16

+0

我已经发布了完整的代码,但仍然得到索引超出界限的错误。似乎无法找到问题。 – 2011-05-02 11:06:19

1

正确我,如果我错了,但是当你创建数组:

TableCell[] tc = new TableCell[3] 

你必须元素:

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

您不能指定给tc [3]。
另外,为什么你要用长度为1的循环?应该是全长;

+0

这只是一个错字,应该说tc [2],而不是tc [3]。此外,我把-1放在循环中,因为我得到了一个索引超出了数组错误消息的界限:) – 2011-05-02 10:50:33