在CreateChildControls之后,Controls.Remove()不起作用?

时间:2013-07-25 10:28:12

标签: asp.net sharepoint-2010 web-parts

我正在开发一个SharePoint 2010非可视WebPart,它在一个大表中显示某种数据。 应该通过从DropDownList中选择过滤器标准来过滤表行。该DropDownList是webpart的一部分。

DropDownList的OnSelectedIndexChanged事件在CreateChildControls之后和OnPreRender之前触发。由于表的单元格包含附加了OnClick事件的LinkBut​​tons,因此必须在CreateChildControls中创建它们才能获取OnClick事件。

我不知道在DropDownList的OnSelectedIndexChanged被触发之前要隐藏哪些表,所以我在CreateChldControls中创建所有可能的表行,并尝试在OnSelectedIndexChanged事件中直接或在OnPreRender中删除过滤后的行。这些行是从父表的控件集合中物理删除的,但它们是显示的nevertheles。

作为测试,我尝试在创建它们之后删除CreateChildControls方法末尾的一些随机行,它工作正常并且没有渲染行。

我如何删除行:

  Table mt = FindControl("matrixtable") as Table;

  Helpers.Log("Controls in Table: " + mt.Controls.Count);
  foreach (int kdid in kdIdsInvisible)
  {
     TableRow c = mt.FindControl("kdrow" + kdid) as TableRow;
     Helpers.Log(c.ID);
     mt.Controls.Remove(c);
  }
  Helpers.Log("Controls in Table: " + mt.Controls.Count);

输出:

Controls in Table: 88
Controls in Table: 2

但所有行仍然呈现......

有解决方案吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

调试:

循环并向屏幕写入表中所有行的所有ID。

然后再次循环,并将所有已删除的行ID写入屏幕。

找到未删除的两行,并查看它们是否具有ID。可能存在拆分表格单元格。

最糟糕的情况是,在visual studio中调试WP并逐个观看删除的行并观察表的计数以查看正在跳过哪一行。尝试删除即时窗口的那些行,看看你得到了什么错误。

答案 1 :(得分:1)

我认为您需要从表行集合中删除该行。尝试用mt.Controls.Remove(c);

替换行mt.Rows.Remove(c);

以下是删除SelectedIndexChanged event

中的行的工作示例
[ToolboxItemAttribute(false)]
public class TableTest : WebPart
{
    protected override void CreateChildControls()
    {
        // Build a table
        Table t = new Table();
        t.ID = "table";
        for (int i = 0; i < 11; i++)
        {
            TableRow tr = new TableRow();
            t.Rows.Add(tr);
            for (int j = 0; j < 5; j++)
            {
                TableCell tc = new TableCell();
                tc.Controls.Add(new LiteralControl("Row " + i + " Cell " + j));
                tr.Cells.Add(tc);
            }
        }
        // Add a dropdown
        DropDownList dl = new DropDownList();
        dl.AutoPostBack = true;
        dl.Items.Add(new ListItem { Text = "Odd", Value = "1" });
        dl.Items.Add(new ListItem { Text = "Even", Value = "2" });
        dl.SelectedIndexChanged += dl_SelectedIndexChanged;

        // Add to the controls collection
        Controls.Add(dl);
        Controls.Add(t);
    }

    void dl_SelectedIndexChanged(object sender, EventArgs e)
    {
        // Get the table and dropdown
        Table t = FindControl("table") as Table;
        DropDownList dl = sender as DropDownList;
        if (t != null && dl != null)
        {
            int i = 1;
            // Set up a list to hold the rows to remove
            IList<TableRow> removeRows = new List<TableRow>();

            if (dl.SelectedValue == "1") // Get all odd rows
            {                   
                foreach (TableRow tr in t.Rows)
                {
                    if (i % 2 == 0)
                    {
                        removeRows.Add(tr); // Add odd rows to the list of rows to remove
                    }
                    i++;
                }
            }
            else // Get all even rows
            {
                foreach (TableRow tr in t.Rows)
                {
                    if (i % 2 == 1)
                    {
                        removeRows.Add(tr); // Add even rows to the list of rows to remove
                    }
                    i++;
                }
            }

            foreach (var tr in removeRows)
            {
                t.Rows.Remove(tr); // Remove the rows from the table
            }
        }
    }
} 
相关问题