C# 如何从列表中添加数据<;列表<;字符串>&燃气轮机;添加到列表视图
我有一个C# 如何从列表中添加数据<;列表<;字符串>&燃气轮机;添加到列表视图,c#,winforms,linq,listview,C#,Winforms,Linq,Listview,我有一个列表MyList,其中包含 { "A1","B1","C1" } { "A2","B2","C2" } { "A3","B3","C3" } 我需要将其添加到具有三列的ListView控件中 因此列表视图如下所示 __Clm1________________Clm2________________Clm3_______________ A1 A2 A2 B1
列表
MyList,其中包含
{ "A1","B1","C1" }
{ "A2","B2","C2" }
{ "A3","B3","C3" }
我需要将其添加到具有三列的ListView控件中
因此列表视图如下所示
__Clm1________________Clm2________________Clm3_______________
A1 A2 A2
B1 B2 B3
C1 C2 C3
___S.No __Clm1________________Clm2________________Clm3_______________
1 A1 A2 A2
2 B1 B2 B3
3 C1 C2 C3
使用LINQ有什么方法可以做到这一点吗
编辑以下是我的解决方案:
ListViewItem[] lItem = MyList.Select(
X => new ListViewItem(X.ToArray())
).ToArray();
listView1.Items.AddRange(lItem);
但这里我需要添加一个索引。。。。列表视图如下所示
__Clm1________________Clm2________________Clm3_______________
A1 A2 A2
B1 B2 B3
C1 C2 C3
___S.No __Clm1________________Clm2________________Clm3_______________
1 A1 A2 A2
2 B1 B2 B3
3 C1 C2 C3
如何将索引添加到列表视图?是。。我有个解决办法。。。。给你
int i=1;
ListViewItem[] lItem =MyList.Select(X=> new ListViewItem(new String[]{i++.ToString()}.Concat(X).ToArray())).ToArray();
listView1.Items.AddRange(lItem);
使用带索引的
Select
重载:
var rows = new List<List<string>>()
{
new List<string>(){ "A1","B1","C1" },
new List<string>(){ "A2","B2","C2" },
new List<string>(){ "A3","B3","C3" },
};
listView1.Items.AddRange(
rows.Select(
(row, index) => new ListViewItem(
new[] { index.ToString() }
.Concat(row)
.ToArray()
)
)
.ToArray()
);
var行=新列表()
{
新列表(){“A1”、“B1”、“C1”},
新列表(){“A2”、“B2”、“C2”},
新列表(){“A3”、“B3”、“C3”},
};
listView1.Items.AddRange(
行。选择(
(行,索引)=>新建ListViewItem(
新[]{index.ToString()}
.Concat(世界其他地区)
.ToArray()
)
)
.ToArray()
);
我个人会使用不同的样式(本地委托,或扩展方法+流畅的语法),因为我真的不喜欢内联调用ToArray,但这与您将得到的内置样式非常接近:)
如果您对extension method+fluent syntax选项感兴趣,请参阅我的其他答案。我个人认为这一点更清晰:
var myList = new List<List<string>>()
{
new List<string>(){ "A1","B1","C1" },
new List<string>(){ "A2","B2","C2" },
new List<string>(){ "A3","B3","C3" },
};
listView.BeginUpdate();
foreach (var row in myList)
{
var item = new ListViewItem(listView.Items.Count.ToString());
item.SubItems.AddRange(row);
listView.Items.Add(item);
}
listView.EndUpdate();
var myList=new List()
{
新列表(){“A1”、“B1”、“C1”},
新列表(){“A2”、“B2”、“C2”},
新列表(){“A3”、“B3”、“C3”},
};
BeginUpdate();
foreach(myList中的var行)
{
var item=newlistViewItem(listView.Items.Count.ToString());
item.SubItems.AddRange(行);
listView.Items.Add(item);
}
EndUpdate();
如果您经常使用类似的列表视图
控件,那么添加一些简单的扩展方法可能是值得的:
public static class ListViewExtensions
{
public static ListView AddItems(this ListView listView,
IEnumerable<ListViewItem> items)
{
listView.Items.AddRange(items.ToArray());
return listView;
}
public static ListViewItem WithSubItems(this ListViewItem item,
IEnumerable<string> subItems)
{
item.SubItems.AddRange(subItems.ToArray());
return item;
}
}
公共静态类ListViewExtensions
{
公共静态ListView附加项(此ListView ListView,
(可数项目)
{
listView.Items.AddRange(Items.ToArray());
返回列表视图;
}
带有子项的公共静态ListViewItem(此ListViewItem,
IEnumerable子项)
{
item.SubItems.AddRange(SubItems.ToArray());
退货项目;
}
}
生成的代码变得非常简洁明了:
var rows = new List<List<string>>()
{
new List<string>(){ "A1","B1","C1" },
new List<string>(){ "A2","B2","C2" },
new List<string>(){ "A3","B3","C3" },
};
listView1.AddItems(
rows.Select(
(row, index) => new ListViewItem(index.ToString())
.WithSubItems(row)
)
);
var行=新列表()
{
新列表(){“A1”、“B1”、“C1”},
新列表(){“A2”、“B2”、“C2”},
新列表(){“A3”、“B3”、“C3”},
};
listView1.AddItems(
行。选择(
(行,索引)=>新建ListViewItem(index.ToString())
.带SUBITEMS(世界其他地区)
)
);
为什么不直接将每一行添加到listview中,而不是首先构建一个新数组?@jgauffin:在实际场景中,变量blah
来自于稀薄的空气(另一个函数)。它实际上并不像我这里的例子那样是内联的。此示例用于显示如何对AddRange
行进行编码。另外,如果您正在谈论我为什么需要ToArray()
,这是因为AddRange
方法和ListViewItem
构造函数采用数组,而不是IEnumerable
@jgauffin:当然,您可以始终使用foreach循环;)他的另一个问题是“如何在LINQ中执行X”(如何将XDocument
转换为他在这个问题开始时拥有的List
),因此我认为他需要内嵌式/声明式/“LINQ风格”答案。我的意思是,listView1.Items.AddRange
可以替换为listView1.Items.Add
遍历blah
。