我正在开发一个SharePoint 2010非可视WebPart,它在一个大表中显示某种数据。 应该通过从DropDownList中选择过滤器标准来过滤表行。该DropDownList是webpart的一部分。
DropDownList的OnSelectedIndexChanged事件在CreateChildControls之后和OnPreRender之前触发。由于表的单元格包含附加了OnClick事件的LinkButtons,因此必须在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
但所有行仍然呈现......
有解决方案吗?提前谢谢!
答案 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
}
}
}
}