【问题标题】:Add / Remove columns in ListView在 ListView 中添加/删除列
【发布时间】:2016-06-06 12:08:31
【问题描述】:

现在我的代码中有一个 ListView。

<asp:ListView ID="ListView1" runat="server" OnPagePropertiesChanging="OnPagePropertiesChanging">
  <LayoutTemplate>
    <table class="global-table">
      <tr runat="server">
        <th>Header1</th>
        <th>Header2</th>
        <th>Header3</th>
        <th>Header4</th>

      </tr>
      <asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
    </table>

  </LayoutTemplate>
  <ItemTemplate>
    <tr runat="server">
      <td><%# DataBinder.Eval(Container.DataItem, "Column1") %></td>
      <td><%# DataBinder.Eval(Container.DataItem, "Column2") %></td>
      <td><%# DataBinder.Eval(Container.DataItem, "Column3") %></td>
      <td><%# DataBinder.Eval(Container.DataItem, "Column4") %></td>

    </tr>
  </ItemTemplate>
</asp:ListView>

我使用数据表填充此 ListView。 (无需手动添加)。

假设我设置了一个条件,例如:

bool isTrue = true;
if(isTrue)
{
 //Add or remove some other column
}

如果该条件为真,我如何在运行时添加或删除列(标题和内容)?

C# 框架:4.5.2

【问题讨论】:

  • 如果你想从数据表中删除它 here 如果从列表视图中删除它 here 否则我没有正确理解你的问题

标签: c# asp.net listview


【解决方案1】:

如果条件由页面的属性给出:

protected bool IsColumnVisible
{
    get { return ... }
}

您可以在标记中使用它来显示/隐藏普通行的列:

<asp:ListView ID="ListView1" runat="server" 
    OnPagePropertiesChanging="OnPagePropertiesChanging"
    OnPreRender="ListView1_PreRender">
  <LayoutTemplate>
    <table class="global-table">
      <tr runat="server">
        <th>Header1</th>
        <th>Header2</th>
        <th>Header3</th>
        <th id="thColumn4" runat="server">Header4</th>
      </tr>
      <asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
    </table>
  </LayoutTemplate>
  <ItemTemplate>
    <tr runat="server">
      <td><%# DataBinder.Eval(Container.DataItem, "Column1") %></td>
      <td><%# DataBinder.Eval(Container.DataItem, "Column2") %></td>
      <td><%# DataBinder.Eval(Container.DataItem, "Column3") %></td>
      <td runat="server" visible='<%# IsColumnVisible %>'><%# DataBinder.Eval(Container.DataItem, "Column4") %></td>
    </tr>
  </ItemTemplate>
</asp:ListView>

由于数据绑定表达式在 LayoutTemplate 中不起作用,您可以在代码隐藏中显示/隐藏标题单元格:

protected void ListView1_PreRender(object sender, EventArgs e)
{
    ListView1.FindControl("thColumn4").Visible = IsColumnVisible;
}

【讨论】:

  • 这适用于 td 元素,但不适用于 th - 布局模板标题。完全不知道为什么会这样。我还尝试设置 Header4 ,即使这样它也没有从结果表中删除。 (这些值被删除并左移 1。)。似乎是一个非常奇怪的问题,因为我希望 th 元素在将可见性设置为 false 时不可见。
  • 确实如此。数据绑定不适用于 LayoutTemplate。我修改了答案以在代码隐藏中处理这种情况。
  • 好的。我休息后它开始工作。我实际上没有改变任何东西,而且我之前进行了一次控件刷新,并对其进行了多次重建...... Visual Studio 只是在工作。 ://
  • PS:当我说它有效时,我的意思不是因为 IsColumnVisible 而是因为 visible="false" (由于某些未知原因它以前不起作用)。您给出的更改后的答案效果很好。它确实会根据需要隐藏它。万分感谢。 :) 将答案标记为正确答案。我假设这个问题的其他答案与 WindowsForms 而不是 Web 表单有关。 ://
【解决方案2】:

只需删除所需索引处的列:

listView1.Columns.RemoveAt(3);

当你想要它时,只需插入它的名字:

listView1.Columns.Insert(3, "Column Name");

它将返回其值。

【讨论】:

  • 这样做会给我错误:[ 错误 9 'ListView' 不包含 'Columns' 的定义,并且没有扩展方法 'Columns' 接受类型为 'ListView' 的第一个参数找到(您是否缺少 using 指令或程序集引用?)。 ] 我是否缺少使用参考?没想到我和以前一样:使用 System.Web.UI;使用 System.ComponentModel;使用 System.Web.UI.WebControls; 并且列表视图工作正常。
【解决方案3】:

您可以从后面的代码中插入新项目... 插入

string[] row={col1 value, col2 value, col3 value .....}
var newItem=new ListViewItems(row)
listViewItem.Items.Add(newItem)

客户端。

 $(".row").parents("tr").append("<tr><td>col1 value</td><td>col 2 value</td><td>col3 value</td></tr>");

删除 在 ListView 事件上

 protected void listview_OnItemCommand(o as sender,e eventarg)
    {
              var row=(ListViewDataItem)e.Item;
              listView.Items.Remove(row);
    }

客户端

 $(".row").parents("tr").remove();

【讨论】:

    【解决方案4】:

    您可以始终添加隐藏可见性的列,当您的条件为真时,您可以更改每个列的可见性。

    标题/列必须具有属性 runat="Server" 和唯一​​ ID

    【讨论】:

    • 不会将列的可见性作为隐藏的浪费资源来发送该数据吗?在我自己的代码中,这并不重要,因为我并不是在一个有大量人连接的网站上工作,但通常这不是一种糟糕的编码方式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多