ListViewItem 添加数据失败,大神帮帮忙,刚学 C#WPF

2019-10-03 18:43:21 +08:00
 pinews
在 ListView 里添加数据,用 ListViewItem 我是在网上找的,官网也有,但是结果不对,不知道是不是资料悄悄更新了
using System.Windows.Forms;

ListViewItem item = new ListViewItem();
item.SubItems[0].Text = "Tommy";
item.SubItems.Add("");
item.SubItems.Add("23");
listView1.Items.Add(item);

显示却是
ListViewItem:{Tommy}

类似的添加方法很多,但是统统都是这样,我都快要死了,到底发生了什么,
4851 次点击
所在节点    .NET
21 条回复
salamanderMH
2019-10-03 19:35:22 +08:00
你不是应该添加多个 ListViewItem 吗?
pinews
2019-10-03 19:38:44 +08:00
@salamanderMH 那就是多个 ListViewItem:{Tommy},不对。
mumbler
2019-10-03 19:39:18 +08:00
item.SubItems[0].Text = "Tommy";
这句不要即可,字段值全部 add 方式添加
pinews
2019-10-03 19:58:54 +08:00
@mumbler 所有类似的方法我都试过了呢,包括你说的
mumbler
2019-10-03 20:08:26 +08:00
listView1 创建了几个字段?
pinews
2019-10-03 20:15:22 +08:00
@mumbler 你好,我建过 1 个,2 个,3 个,4 个,每个都是 ListViewItem:{Tommy}
pinews
2019-10-03 20:23:55 +08:00
pinews
2019-10-03 20:24:34 +08:00
skywalker0507
2019-10-03 22:01:38 +08:00
ListViewItem item = new ListViewItem
{
Content = new StackPanel
{
Orientation = Orientation.Horizontal,
Children =
{
new TextBox
{
Text = "Tommy"
},
new TextBox
{
Text = "123"
},
}
}
};

ListView1.Items.Add(item);

这样试试?
pinews
2019-10-03 22:46:16 +08:00
@skywalker0507 报了很多错。。。
我有个疑问 ListViewItem 这个办法真的有用吗?
ragnaroks
2019-10-04 01:06:56 +08:00
ListView 的 content 是 List<Control>,ListViewItem 是 Control 的可选项之一,换句话说,

ListView listview1=new ListView();
ListViewItem[] items=new ListViewItem[4];
items[0]=new ListViewItem();
items[1]=new ListViewItem();
items[2]=new ListViewItem();
items[3]=new ListViewItem();
listview1.ItemSource=items;

什么 Add/Append/Insert 之类都是 form 时代的遗毒,你既然已经用 WPF 了就不要考虑这些了
pinews
2019-10-04 10:13:11 +08:00
@ragnaroks 我昨天搜索了 github,发现能用的的确是个 windows 应用程序(意思是不是 wpf 了),意思是 wpf 用不了了?
itemSource 出错了

错误 CS1061 “object”未包含“ItemSource”的定义,并且找不到可接受第一个“object”类型参数的扩展方法“ItemSource”(是否缺少 using 指令或程序集引用?)
不好意思我是个小白
pinews
2019-10-04 10:38:59 +08:00
我新建了一个 windows 窗体应用,这个方法可以用,wpf 我再研究研究,谢谢大家。
mingl0280
2019-10-05 02:08:44 +08:00
因为你用错了
mingl0280
2019-10-05 02:14:25 +08:00
@pinews
WPF 的 ListView 是这么用的(注意看 Image 和 TextBlock 的绑定):
https://gist.github.com/mingl0280/7e24ff52eb7af5ad8b127fee45288592
pinews
2019-10-05 14:49:43 +08:00
@mingl0280 超时打不开
forgottencoast
2019-10-05 22:14:43 +08:00
买本书来看看呀,基本上不会手工添加数据的,都是用绑定来解决。
shinytea2017
2019-10-05 22:30:51 +08:00
@pinews , gist 如果不上 vpn 是直接访问不了的;

/// MainWindow.xaml:
/// 注意 Image 的 Source 和 TextBlock 的 Text 属性
<ListView x:Name="MaterialListView" Margin="565,28,0,24" SelectionMode="Single" AlternationCount="-1" ScrollViewer.CanContentScroll="True" ItemsSource="{Binding}" PreviewMouseDown="MaterialListView_PreviewMouseDown" PreviewMouseDoubleClick="MaterialListView_PreviewMouseDoubleClick">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate>
<Grid Height="100" >
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="25"/>
<RowDefinition Height="25"/>
</Grid.RowDefinitions>
<Image Source="{Binding MaterialUrl}"/>
<TextBlock Text="{Binding MaterialName}" Grid.Row="1" TextAlignment="Center"/>
<TextBlock Text="{Binding MaterialCount}" Grid.Row="2" TextAlignment="Center"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<EventSetter Event="MouseEnter" Handler="ListViewItem_MouseEnter"/>
<EventSetter Event="MouseLeave" Handler="ListViewItem_MouseLeave"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
/// Material.cs 这个是独立的一个类
public class Material
{
public string MaterialUrl { get; set; }
public string MaterialName { get; set; }
public string MaterialCount { get; set; }
public string MaterialID { get; set; }

public Material()
{
MaterialUrl = "";
MaterialName = "";
MaterialCount = "";
}
public Material(int id, string url, string name, int count)
{
MaterialID = id.ToString();
MaterialUrl = url;
MaterialName = name;
MaterialCount = "x" + count.ToString();
if (count <= 0)
{
MaterialCount = "";
}
}
}
///添加物品代码(MainWindow.xaml.cs)
List<Material> mList = new List<Material>();
///...数据提取, dt 是 dataTable
for (int i = 0; i < dt.Rows.Count; i++)
{
if (rid != Convert.ToInt32(dt.Rows[i][0]))
{
mList.Add(new Material(-1, "", "或", -1));
rid = Convert.ToInt32(dt.Rows[i][0]);
}
mList.Add(new Material(Convert.ToInt32(dt.Rows[i][4]), dt.Rows[i][3].ToString(), dt.Rows[i][2].ToString(), Convert.ToInt32(dt.Rows[i][1])));
}
MaterialListView.ItemsSource = mList;
pinews
2019-10-05 22:56:39 +08:00
@forgottencoast
@shinytea2017 谢谢,我的意思是 ListViewItem 这个写法只能 form 用,wpf 不能这样用对不对?我现在不确定的是这个,wpf 我也看到了代码,之前不知道 form 和 wpf 的区别。
forgottencoast
2019-10-15 17:25:24 +08:00
@pinews WPF 的 ListViewItem 是没有 SubItems 的,你用的 System.Windows.Forms 命名空间是 WinForm 的,WPF 的在 System.Windows.Controls 命名空间下。
类似的写法 WPF 也是有的,使用 Items 属性,或者 ItemsSource 属性。
你可以参考: https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.itemscontrol.items?view=netframework-4.8

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/606174

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX