gpt4 book ai didi

c# - 如何从 ListView c# 中删除列

转载 作者:太空宇宙 更新时间:2023-11-03 21:27:52 25 4
gpt4 key购买 nike

我是 ListView 的新手,遇到了一个小问题:

我在 WinForm 中有一个 ListView,我用许多列(大约 15 列)一行一行地填充它,稍后我可以选择保存 ListView CSV 。我想要的是一种让用户从 ListView 中删除不需要的列的方法。

我首先创建列的函数

    private void checkAddListBoxColumns(DomainLayer.ScriptLogic.session sessionToAdd)
{
if (IsResultLogListViewFirstRun)
{
IsResultLogListViewFirstRun = false;
this.Invoke((MethodInvoker)delegate
{
ResultsLogTab_ListView.Columns.Clear();
});

foreach (var item in sessionToAdd.comments.Keys)
{
this.Invoke((MethodInvoker)delegate
{
ResultsLogTab_ListView.Columns.Add(item);
});
}
McsTableRow mcsTR = new McsTableRow();
Type t = mcsTR.GetType();
foreach (/*PropertyInfo*/FieldInfo info in t.GetFields())
{
this.Invoke((MethodInvoker)delegate
{
ResultsLogTab_ListView.Columns.Add(info.Name+" 1");
});
}
foreach (FieldInfo info in t.GetFields())
{
this.Invoke((MethodInvoker)delegate
{
ResultsLogTab_ListView.Columns.Add(info.Name+" 2");
});
}
this.Invoke((MethodInvoker)delegate
{
ResultsLogTab_ListView.Columns.Add("Effective PHY Rate");
});
//...more of the same
}
else
{
//?
}
}

稍后我添加一行

            private OnSessionToAdd()
{
foreach (string key in sessionToAdd.comments.Keys)
{
item.SubItems.Add(sessionToAdd.comments[key]);
}

Type t = sessionToAdd.CurrentMCSCheck.firstMcsRow.GetType();

foreach (FieldInfo info in t.GetFields())
{
string x = info.GetValue(sessionToAdd.CurrentMCSCheck.firstMcsRow) as string;
item.SubItems.Add(x);
}

t = sessionToAdd.CurrentMCSCheck.secondMcsRow.GetType();

foreach (FieldInfo info in t.GetFields())
{
string x = info.GetValue(sessionToAdd.CurrentMCSCheck.secondMcsRow) as string;
item.SubItems.Add(x);
}

item.SubItems.Add(sessionToAdd.CurrentMCSCheck.EffectivePHYRate);

this.Invoke((MethodInvoker)delegate
{
ResultsLogTab_ListView.Items.Add(item);
});
}

我需要的是一种获取列的所有名称的方法,而不是按名称或某种 IndexOf(name) 删除列

请指出正确的方向

编辑

只是为了清楚我不隐藏列(设置宽度 = 0)我想删除它们为了帮助您理解我的观点,我添加了保存 ListView 的方式我保存到 CSV 的方式:

public StringBuilder ListViewToCSV(ListView listView, string filePath, bool includeHidden)
{
//make header string
StringBuilder result = new StringBuilder();
WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listView.Columns[i].Text);

//export data rows
foreach (ListViewItem listItem in listView.Items)
WriteCSVRow(result, listView.Columns.Count, i => includeHidden || listView.Columns[i].Width > 0, i => listItem.SubItems[i].Text);

return result;

}

private static void WriteCSVRow(StringBuilder result, int itemsCount, Func<int, bool> isColumnNeeded, Func<int, string> columnValue)
{
bool isFirstTime = true;
for (int i = 0; i < itemsCount; i++)
{
if (!isColumnNeeded(i))
continue;

if (!isFirstTime)
result.Append(",");
isFirstTime = false;

result.Append(String.Format("\"{0}\"", columnValue(i)));
}
result.AppendLine();
}

不仅仅是保存 StringBuilder

最佳答案

您可以按名称引用该列。

var columnToRemove = ResultsLogTab_ListView.Columns["Name Of Column"];

然后删除它

ResultsLogTab_ListView.Columns.Remove(columnToRemove);

所有这些都记录在 MSDN 上这是一个很好的资源。

更新

关于从 CSV 保存/加载,假设您有一个 List<string>您要保留的列名(从所述 CSV 文件中获取)的数量,然后您可以使用 LINQ 查找不匹配的列,然后遍历结果以将其删除。

using System.Linq;

...

var columnNames = new List<string> { "one", "two", "three" };

var columnsToDelete = ResultsLogTab_ListView.Columns.Where(c => !columnNames.Contains(c.Name));

foreach(var column in columnsToDelete)
{
ResultsLogTab_ListView.Columns.Remove(column);
}

关于c# - 如何从 ListView c# 中删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25884450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com