如何从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); }