在ListView中添加/删除列

3
现在我的代码中有一个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>

我将使用数据表格来填充此列表视图。(无需手动添加)
假设我设置了某个条件,例如:
bool isTrue = true;
if(isTrue)
{
 //Add or remove some other column
}

如果这个条件为真,我如何在运行时添加或删除列(包括表头和内容)?

C#框架:4.5.2


如果您想从数据表中删除它,请参阅此处(https://dev59.com/s3VD5IYBdhLWcg3wI3-L),如果是从列表视图中,请参阅此处(http://stackoverflow.com/questions/25884450/how-to-remove-columns-from-listview-c-sharp),否则我没有正确理解您的问题。 - Mong Zhu
4个回答

3
如果条件是由页面属性给出的:
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 - 布局模板标题。我不确定为什么会发生这种情况。我还尝试设置**<th runat="server" visible="false">Header4</th>**,即使如此,它也没有从结果表中删除。(值被删除并向左移动1个位置)。这似乎是一个非常奇怪的问题,因为我希望在将可见性设置为false时,th元素不应该可见。 - The 0bserver
没错。数据绑定在LayoutTemplate中不起作用。我修改了我的答案,在代码后台处理这种情况。 - ConnorsFan
好的。我休息一下后它就开始工作了。我真的什么都没改过,而且之前已经刷新了控件并重新构建了几次……Visual Studio 真是在胡闹。 :/ - The 0bserver
PS:我上面所说的它能够工作,并不是因为IsColumnVisible,而是因为visible="false"(之前由于某些未知原因无法工作)。你给出的修改后的答案很好用,确实可以按需隐藏。非常感谢。:) 我已将该答案标记为正确答案。我认为此问题的其他答案与WindowsForms有关,而不是Web Forms。 :/ - The 0bserver

2

只需删除您想要的索引列:

listView1.Columns.RemoveAt(3);

当您想要找回它时,只需使用它的名称插入即可:

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

它将返回其值。

执行此操作时,我遇到了错误:**[错误9“ListView”未包含“Columns”的定义,也找不到接受类型为“ListView”的第一个参数的“Columns”扩展方法(您是否缺少使用指令或程序集引用?)。”]** 我是否缺少使用引用?我认为没有,因为我已经添加了以下引用:**using System.Web.UI; using System.ComponentModel;using System.Web.UI.WebControls;**而且 ListView 的功能正常。 - The 0bserver
1
请参考 - https://dev59.com/nWsz5IYBdhLWcg3wj4ra - Rahul Hendawe

1
从代码后台,您可以插入新项目,如...插入。
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();

0

你可以始终添加带有visibility hidden属性的列,当条件为真时,你可以更改每个列的可见性。

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


将列的可见性保持为隐藏状态,是否会浪费发送该数据的资源?在我的代码中,这并不是很重要,因为我并没有在连接大量人员的网站上工作,但通常来说,这不是一种不好的编码方式吗? - The 0bserver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接