【问题标题】:ASP.NET: Hide CheckBox items in CheckBoxList controlASP.NET:在 CheckBoxList 控件中隐藏 CheckBox 项
【发布时间】:2011-09-20 16:45:24
【问题描述】:

我有一个数据绑定的 CheckBoxList 控件,它可以变得非常大,所以我正在尝试为它创建一个过滤器。这就是我正在做的事情:

foreach( ListItem item in this.UserRolesList.Items ) {
    if( !item.Value.StartsWith( this.RolesFilterList.SelectedValue ) ) {
        item.Attributes.CssStyle["display"] = "none";
    } else item.Attributes.CssStyle["display"] = "inline";
}

这主要是有效的,除了当 ASP.NET 呈现 CheckBoxList 时,它使用一个表来实现,每个 CheckBox 控件嵌套在它自己的 <TR> 元素中。这意味着即使我不想看到的项目没有显示,它们的行的空白是,所以我仍然需要满足相当多的白人节奏。

我不知道我可以访问 <TR> 元素而不对控件进行子类化,这是我没有时间做的“不错的”功能,所以我想知道是否有我可以用来访问元素父级的 CSS 技巧(例如,<input type="checkbox"/> -> <td> -> <tr>)。我之前用过:first-child这个伪元素,但是我的网络搜索这种伎俩没有结果,所以我有疑问。不过问也无妨,对吧?

【问题讨论】:

  • 在绑定到复选框列表之前,您是否有无法过滤数据源的原因?
  • 您可以使用RepeatLayout:msdn.microsoft.com/en-us/library/… 停止将其呈现为表格
  • @patmortech 我认为重复调用数据库会更有效,因为用户需要过滤、更改值、过滤、更改值等,然后单击表单的保存按钮。
  • 在下面重申一下 patmortech 的 cmets,ListItem 对象上没有 Visible 属性。

标签: c# asp.net css checklistbox


【解决方案1】:

这可能对你有用。它从列表中完全删除该项目,使其根本不会被渲染:

string value = this.RolesFilterList.SelectedValue;
int count = this.UserRolesList.Items.Count - 1;

for(var i=count;i>=0;i--)
{
    ListItem item = this.UserRolesList.Items[i];
    if (!item.Value.StartsWith(value))
    {
        this.UserRolesList.Items.RemoveAt(i);
    }
}

更新

根据您上面关于您希望从用户的角度如何操作的评论,您可能最好在 javascript 中执行所有客户端操作,而不是以这种方式在回发中执行此操作。

在 jQuery 中,您可以创建一个在选择列表更改时运行的函数,然后在 UserRolesList 表中找到所有复选框,然后循环遍历它们,并根据它们的值使用 .closest('tr') 函数隐藏/显示包含它们的整个表格行。

【讨论】:

  • 你的编辑让我意识到我找错了树。我想尽量减少数据库调用,但我试图通过代码隐藏来做到这一点,而客户端确实是我想要的,.closest 正是我想要的。
猜你喜欢
  • 2013-12-23
  • 2023-03-02
  • 1970-01-01
  • 2011-10-18
  • 2018-06-08
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多