You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7+C#如何通过编程方式向ListView添加数据?

.NET 7 C# 原生实现 ListView 动态添加数据示例

以下分别针对WinForms和WPF两种常见桌面应用场景,提供原生无第三方依赖的实现方案:


WinForms 场景实现

假设你已在WinForms项目中添加了ListView控件(命名为listView1),可按以下步骤操作:

1. 初始化ListView列(设计器已配置可跳过)

在窗体的Load事件或构造函数中初始化列和视图模式:

private void Form1_Load(object sender, EventArgs e)
{
    listView1.View = View.Details;
    // 添加需要显示的列
    listView1.Columns.Add("ID", 80);
    listView1.Columns.Add("名称", 150);
    listView1.Columns.Add("状态", 100);
}

2. 数据接收与ListView填充

先定义服务器返回的实体类(示例):

public class ServerData
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
    // 其他无需显示的字段
    public string ExtraField { get; set; }
}

然后实现数据获取与添加逻辑(异步模式适配网络请求):

// 模拟从服务器获取数据的方法,替换为实际HTTP请求逻辑
private async Task<List<ServerData>> FetchServerDataAsync()
{
    await Task.Delay(1000); // 模拟网络延迟
    return new List<ServerData>
    {
        new ServerData { Id = 1, Name = "设备A", Status = "在线", ExtraField = "冗余数据1" },
        new ServerData { Id = 2, Name = "设备B", Status = "离线", ExtraField = "冗余数据2" },
        new ServerData { Id = 3, Name = "设备C", Status = "在线", ExtraField = "冗余数据3" }
    };
}

// 绑定到按钮点击或其他触发事件
private async void btnLoadData_Click(object sender, EventArgs e)
{
    listView1.Items.Clear(); // 清空现有数据(可选)
    
    var serverDataList = await FetchServerDataAsync();
    // 遍历数据,仅提取需要的字段添加到ListView
    foreach (var data in serverDataList)
    {
        var listItem = new ListViewItem(data.Id.ToString());
        listItem.SubItems.Add(data.Name);
        listItem.SubItems.Add(data.Status);
        listView1.Items.Add(listItem);
    }
}

WPF 场景实现

WPF推荐使用数据绑定模式,更符合框架设计规范,原生实现无需第三方包:

1. 定义数据模型与ViewModel

// 服务器返回数据实体
public class ServerData
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Status { get; set; }
}

// ViewModel,实现INotifyPropertyChanged支持数据更新通知
public class MainViewModel : INotifyPropertyChanged
{
    private ObservableCollection<ServerData> _displayItems;
    public ObservableCollection<ServerData> DisplayItems
    {
        get => _displayItems;
        set
        {
            _displayItems = value;
            OnPropertyChanged(nameof(DisplayItems));
        }
    }

    public MainViewModel()
    {
        DisplayItems = new ObservableCollection<ServerData>();
    }

    // 加载服务器数据并过滤显示内容
    public async Task LoadAndFilterDataAsync()
    {
        DisplayItems.Clear();
        // 替换为实际服务器请求逻辑
        await Task.Delay(1000);
        var rawData = new List<ServerData>
        {
            new ServerData { Id = 1, Name = "设备X", Status = "在线" },
            new ServerData { Id = 2, Name = "设备Y", Status = "离线" },
            new ServerData { Id = 3, Name = "设备Z", Status = "在线" }
        };
        // 仅添加符合条件的数据(示例:仅在线设备)
        foreach (var item in rawData.Where(d => d.Status == "在线"))
        {
            DisplayItems.Add(item);
        }
    }

    // INotifyPropertyChanged 实现
    public event PropertyChangedEventHandler? PropertyChanged;
    protected void OnPropertyChanged(string propName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
    }
}

2. XAML配置ListView

<Window x:Class="WpfListViewDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfListViewDemo"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainViewModel/>
    </Window.DataContext>
    <Grid>
        <StackPanel Margin="10">
            <Button Content="加载数据" Click="BtnLoad_Click" Margin="0 0 0 10"/>
            <ListView ItemsSource="{Binding DisplayItems}">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}" Width="80"/>
                        <GridViewColumn Header="名称" DisplayMemberBinding="{Binding Name}" Width="150"/>
                        <GridViewColumn Header="状态" DisplayMemberBinding="{Binding Status}" Width="100"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </StackPanel>
    </Grid>
</Window>

3. 后台触发数据加载

public partial class MainWindow : Window
{
    private MainViewModel _viewModel;
    public MainWindow()
    {
        InitializeComponent();
        _viewModel = (MainViewModel)DataContext;
    }

    private async void BtnLoad_Click(object sender, RoutedEventArgs e)
    {
        await _viewModel.LoadAndFilterDataAsync();
    }
}

内容的提问来源于stack exchange,提问作者cycle1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:25:45