V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
pinews
V2EX  ›  .NET

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

  •  
  •   pinews · Oct 3, 2019 · 5740 views
    This topic created in 2400 days ago, the information mentioned may be changed or developed.
    在 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 replies    2019-10-18 01:29:27 +08:00
    salamanderMH
        1
    salamanderMH  
       Oct 3, 2019 via Android
    你不是应该添加多个 ListViewItem 吗?
    pinews
        2
    pinews  
    OP
       Oct 3, 2019
    @salamanderMH 那就是多个 ListViewItem:{Tommy},不对。
    mumbler
        3
    mumbler  
       Oct 3, 2019 via Android
    item.SubItems[0].Text = "Tommy";
    这句不要即可,字段值全部 add 方式添加
    pinews
        4
    pinews  
    OP
       Oct 3, 2019
    @mumbler 所有类似的方法我都试过了呢,包括你说的
    mumbler
        5
    mumbler  
       Oct 3, 2019 via Android
    listView1 创建了几个字段?
    pinews
        6
    pinews  
    OP
       Oct 3, 2019
    @mumbler 你好,我建过 1 个,2 个,3 个,4 个,每个都是 ListViewItem:{Tommy}
    pinews
        7
    pinews  
    OP
       Oct 3, 2019
    skywalker0507
        9
    skywalker0507  
       Oct 3, 2019
    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
       Oct 3, 2019
    @skywalker0507 报了很多错。。。
    我有个疑问 ListViewItem 这个办法真的有用吗?
    ragnaroks
        11
    ragnaroks  
       Oct 4, 2019
    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
       Oct 4, 2019
    @ragnaroks 我昨天搜索了 github,发现能用的的确是个 windows 应用程序(意思是不是 wpf 了),意思是 wpf 用不了了?
    itemSource 出错了

    错误 CS1061 “object”未包含“ItemSource”的定义,并且找不到可接受第一个“object”类型参数的扩展方法“ItemSource”(是否缺少 using 指令或程序集引用?)
    不好意思我是个小白
    pinews
        13
    pinews  
    OP
       Oct 4, 2019
    我新建了一个 windows 窗体应用,这个方法可以用,wpf 我再研究研究,谢谢大家。
    mingl0280
        14
    mingl0280  
       Oct 5, 2019
    因为你用错了
    mingl0280
        15
    mingl0280  
       Oct 5, 2019
    @pinews
    WPF 的 ListView 是这么用的(注意看 Image 和 TextBlock 的绑定):
    https://gist.github.com/mingl0280/7e24ff52eb7af5ad8b127fee45288592
    pinews
        16
    pinews  
    OP
       Oct 5, 2019
    @mingl0280 超时打不开
    forgottencoast
        17
    forgottencoast  
       Oct 5, 2019
    买本书来看看呀,基本上不会手工添加数据的,都是用绑定来解决。
    shinytea2017
        18
    shinytea2017  
       Oct 5, 2019
    @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
       Oct 5, 2019
    @forgottencoast
    @shinytea2017 谢谢,我的意思是 ListViewItem 这个写法只能 form 用,wpf 不能这样用对不对?我现在不确定的是这个,wpf 我也看到了代码,之前不知道 form 和 wpf 的区别。
    forgottencoast
        20
    forgottencoast  
       Oct 15, 2019
    @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  
       Oct 18, 2019
    @shinytea2017 卧槽国内居然墙 Gist……完全没想到……
    @pinews WinForm 下才用 ListViewItem
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1171 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 131ms · UTC 18:12 · PVG 02:12 · LAX 11:12 · JFK 14:12
    ♥ Do have faith in what you're doing.