我是ListView
的新手,遇到了一个小问题:
我在ListView
中有一个WinForm
,我在一行一行后填充了很多列(大约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<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
答案 0 :(得分:3)
您可以按名称引用该列。
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);
}