如何从ListView中删除列c#

我是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(名称)删除列的方法

请指出正确的方向

编辑

只是为了清除我不要隐藏列(设置宽度= 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 isColumnNeeded, Func 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列名称(从所述CSV文件中获取),然后您可以使用LINQ查找不匹配的列,然后迭代结果删除它们。

 using System.Linq; ... var columnNames = new List { "one", "two", "three" }; var columnsToDelete = ResultsLogTab_ListView.Columns.Where(c => !columnNames.Contains(c.Name)); foreach(var column in columnsToDelete) { ResultsLogTab_ListView.Columns.Remove(column); }