.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
相关产品推荐
相关产品推荐

