V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pinews
V2EX  ›  .NET

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

  •  
  •   pinews · 2019-10-03 18:43:21 +08:00 · 5058 次点击
    这是一个创建于 1880 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 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}

    类似的添加方法很多,但是统统都是这样,我都快要死了,到底发生了什么,
    21 条回复    2019-10-18 01:29:27 +08:00
    salamanderMH
        1
    salamanderMH  
       2019-10-03 19:35:22 +08:00 via Android
    你不是应该添加多个 ListViewItem 吗?
    pinews
        2
    pinews  
    OP
       2019-10-03 19:38:44 +08:00
    @salamanderMH 那就是多个 ListViewItem:{Tommy},不对。
    mumbler
        3
    mumbler  
       2019-10-03 19:39:18 +08:00 via Android
    item.SubItems[0].Text = "Tommy";
    这句不要即可,字段值全部 add 方式添加
    pinews
        4
    pinews  
    OP
       2019-10-03 19:58:54 +08:00
    @mumbler 所有类似的方法我都试过了呢,包括你说的
    mumbler
        5
    mumbler  
       2019-10-03 20:08:26 +08:00 via Android
    listView1 创建了几个字段?
    pinews
        6
    pinews  
    OP
       2019-10-03 20:15:22 +08:00
    @mumbler 你好,我建过 1 个,2 个,3 个,4 个,每个都是 ListViewItem:{Tommy}
    pinews
        7
    pinews  
    OP
       2019-10-03 20:23:55 +08:00
    pinews
        8
    pinews  
    OP
       2019-10-03 20:24:34 +08:00
    skywalker0507
        9
    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
        10
    pinews  
    OP
       2019-10-03 22:46:16 +08:00
    @skywalker0507 报了很多错。。。
    我有个疑问 ListViewItem 这个办法真的有用吗?
    ragnaroks
        11
    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
        12
    pinews  
    OP
       2019-10-04 10:13:11 +08:00
    @ragnaroks 我昨天搜索了 github,发现能用的的确是个 windows 应用程序(意思是不是 wpf 了),意思是 wpf 用不了了?
    itemSource 出错了

    错误 CS1061 “object”未包含“ItemSource”的定义,并且找不到可接受第一个“object”类型参数的扩展方法“ItemSource”(是否缺少 using 指令或程序集引用?)
    不好意思我是个小白
    pinews
        13
    pinews  
    OP
       2019-10-04 10:38:59 +08:00
    我新建了一个 windows 窗体应用,这个方法可以用,wpf 我再研究研究,谢谢大家。
    mingl0280
        14
    mingl0280  
       2019-10-05 02:08:44 +08:00
    因为你用错了
    mingl0280
        15
    mingl0280  
       2019-10-05 02:14:25 +08:00
    @pinews
    WPF 的 ListView 是这么用的(注意看 Image 和 TextBlock 的绑定):
    https://gist.github.com/mingl0280/7e24ff52eb7af5ad8b127fee45288592
    pinews
        16
    pinews  
    OP
       2019-10-05 14:49:43 +08:00
    @mingl0280 超时打不开
    forgottencoast
        17
    forgottencoast  
       2019-10-05 22:14:43 +08:00
    买本书来看看呀,基本上不会手工添加数据的,都是用绑定来解决。
    shinytea2017
        18
    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
        19
    pinews  
    OP
       2019-10-05 22:56:39 +08:00
    @forgottencoast
    @shinytea2017 谢谢,我的意思是 ListViewItem 这个写法只能 form 用,wpf 不能这样用对不对?我现在不确定的是这个,wpf 我也看到了代码,之前不知道 form 和 wpf 的区别。
    forgottencoast
        20
    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
    mingl0280
        21
    mingl0280  
       2019-10-18 01:29:27 +08:00
    @shinytea2017 卧槽国内居然墙 Gist……完全没想到……
    @pinews WinForm 下才用 ListViewItem
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 03:05 · PVG 11:05 · LAX 19:05 · JFK 22:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.