隐藏/禁用列表视图列(不是宽度= 0黑客)



我们正在重新设计我们的列表视图,以允许用户选择他想要显示的列。

为了在填充列表视图时不弄乱Key-To-Column-Index转换,我们希望保持列的"基本"顺序,然后在某些列上使用显示索引和 (?( 可见属性来调整视图。

即基本表看起来像

id | name | date

它充满了这样的数据

ListViewItem lvi = new ListViewItem();
lvi.Text = someObject.ID;
lvi.SubItems.Add(someObject.Name);
lvi.SubItems.Add(someObject.Date);
...
ListView1.Items.AddRange(CollectionOfListViewItems);

如果用户现在选择了显示顺序id | date | name,则只需更改特定列的显示索引值即可轻松实现此操作(无需修改生成 ListViewItems 的代码(。

但是,如果用户想要排除列,则通常的做法是将宽度设置为 0。但这导致了不愉快的行为,即试图扩展任何列的人有时只是扩展宽度为 0 的列,并且对发生了什么感到困惑。

有没有办法正确隐藏列不显示,而无需实际从列表视图中删除该列?(因为删除列需要调整生成代码,否则标题/值不再正确对齐(。

我现在用 - 让我们称之为 -displayIndex=0hack扩展了width=0黑客。像魅力一样工作:

迭代 1:我们根据我们的定义不断添加列,因此我们不需要重构任何依赖于该列顺序的代码:

foreach (ColumnDefinition cd in this.ColumnDefinitions)
{
ColumnHeader ch = new ColumnHeader();
ch.Name = cd.Name;
ch.Tag = cd;
ch.Text = cd.Text;
this.extendedListView.Columns.Add(ch);
}

迭代 2:为了尊重用户的顺序,我们如上所述修改displayIndex,一旦所有列都添加到列表视图:

foreach (ColumnHeader ch in this.extendedListView.Columns)
{
//DisplayIndex known?
if (keyToIndex.ContainsKey(ch.Name))
{
int idx = keyToIndex[ch.Name];
ch.DisplayIndex = idx;
}
}

注意:用户取消选择的列在配置中没有存储显示索引。因此,它们现在漂浮在某个地方(宽度为 0(,导致在尝试扩展另一列时可以扩展它们的问题。

迭代3:为了克服这个问题,我们只是再次迭代,并将每个不可见的列推送到索引 0。任何用户都不应尝试通过单击最左侧可见列的左侧来调整列的大小

//Avoid inivisble columns (width 0) beeing stuck somewhere in between. 
//push them all to the front, cause no one will try to expand the "0st Column".
foreach (ColumnHeader ch in this.extendedListView.Columns)
{
//DisplayIndex not known?
if (!keyToIndex.ContainsKey(ch.Name))
{
ch.DisplayIndex = 0;
ch.Width = 0;
}
}

最新更新