基于WPF实现DataGrid数据填充及复选框过滤功能的技术求助
嘿,刚看了你写的WPF UI框架,已经有了复选框和DataGrid的雏形啦!接下来咱们一步步把从SQL读数据、绑定到DataGrid,还有复选框过滤的功能补上,超级简单的~
第一步:定义数据模型
首先咱们得先创建一个类来对应SQL表的字段,这样方便后续数据绑定。假设你的SQL表有Id、Environment(对应复选框的DEV/QA这些)、ProjectName、Status这些字段,你可以根据实际情况修改:
using System; namespace WpfApp2 { public class EnvironmentData { public int Id { get; set; } public string Environment { get; set; } public string ProjectName { get; set; } public string Status { get; set; } } }
第二步:从SQL读取数据
接下来写一个方法来从SQL数据库里拉取数据,记得替换成你自己的数据库连接字符串和表名哦:
using System.Collections.Generic; using System.Data.SqlClient; // 如果是.NET Core/.NET 5+,用Microsoft.Data.SqlClient namespace WpfApp2 { public partial class MainWindow { private List<EnvironmentData> GetDataFromSql() { var dataList = new List<EnvironmentData>(); // 替换成你的数据库连接字符串 var connectionString = "Data Source=你的服务器名;Initial Catalog=你的数据库名;Integrated Security=True"; using (var conn = new SqlConnection(connectionString)) { // 替换成你的表名和实际字段 var query = "SELECT Id, Environment, ProjectName, Status FROM 你的表名"; var cmd = new SqlCommand(query, conn); conn.Open(); using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { dataList.Add(new EnvironmentData { Id = (int)reader["Id"], Environment = reader["Environment"].ToString(), ProjectName = reader["ProjectName"].ToString(), Status = reader["Status"].ToString() }); } } } return dataList; } } }
第三步:绑定数据到DataGrid
先给你的DataGrid起个名字,方便后台代码引用,然后在窗口初始化的时候加载数据,同时保存一份原始数据(这样过滤的时候不会丢失源数据):
修改后的XAML里的DataGrid部分
<DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Height="181" Margin="82,202,0,0" VerticalAlignment="Top" Width="679"/>
后台窗口构造函数里加载数据
using System.Collections.Generic; using System.Windows; namespace WpfApp2 { public partial class MainWindow : Window { private List<EnvironmentData> _originalData; // 保存原始数据,用于过滤 public MainWindow() { InitializeComponent(); // 加载SQL数据并绑定到DataGrid _originalData = GetDataFromSql(); dataGrid.ItemsSource = _originalData; } } }
第四步:实现复选框过滤功能
先给每个复选框起个名字,然后添加事件处理逻辑。这里我给你做两种方案:一种是点击Apply按钮过滤,另一种是复选框状态变化时自动过滤,你可以选自己喜欢的~
修改后的XAML复选框和按钮部分
<CheckBox x:Name="chkDev" Content="DEV" HorizontalAlignment="Left" Margin="82,27,0,0" VerticalAlignment="Top" Checked="EnvironmentCheckBox_Changed" Unchecked="EnvironmentCheckBox_Changed"/> <CheckBox x:Name="chkQa" Content="QA" HorizontalAlignment="Left" Margin="82,58,0,0" VerticalAlignment="Top" Checked="EnvironmentCheckBox_Changed" Unchecked="EnvironmentCheckBox_Changed"/> <CheckBox x:Name="chkLab" Content="LAB" HorizontalAlignment="Left" Margin="82,94,0,0" VerticalAlignment="Top" Checked="EnvironmentCheckBox_Changed" Unchecked="EnvironmentCheckBox_Changed"/> <CheckBox x:Name="chkUat" Content="UAT" HorizontalAlignment="Left" Margin="173,27,0,0" VerticalAlignment="Top" Checked="EnvironmentCheckBox_Changed" Unchecked="EnvironmentCheckBox_Changed"/> <CheckBox x:Name="chkPreProd" Content="Pre-Prod" HorizontalAlignment="Left" Margin="173,62,0,0" VerticalAlignment="Top" Checked="EnvironmentCheckBox_Changed" Unchecked="EnvironmentCheckBox_Changed"/> <Button Content="Apply" HorizontalAlignment="Left" Margin="82,140,0,0" VerticalAlignment="Top" Width="75" Click="ApplyButton_Click"/>
过滤逻辑代码
把下面的代码加到MainWindow类里:
private void FilterData() { var selectedEnvs = new List<string>(); // 收集所有选中的环境 if (chkDev.IsChecked == true) selectedEnvs.Add("DEV"); if (chkQa.IsChecked == true) selectedEnvs.Add("QA"); if (chkLab.IsChecked == true) selectedEnvs.Add("LAB"); if (chkUat.IsChecked == true) selectedEnvs.Add("UAT"); if (chkPreProd.IsChecked == true) selectedEnvs.Add("Pre-Prod"); // 根据选中的环境过滤数据 if (selectedEnvs.Count == 0) { // 没选中任何复选框,显示全部数据 dataGrid.ItemsSource = _originalData; } else { var filteredData = _originalData.Where(d => selectedEnvs.Contains(d.Environment)).ToList(); dataGrid.ItemsSource = filteredData; } } // 点击Apply按钮触发过滤 private void ApplyButton_Click(object sender, RoutedEventArgs e) { FilterData(); } // 复选框状态变化时自动触发过滤 private void EnvironmentCheckBox_Changed(object sender, RoutedEventArgs e) { FilterData(); }
最后要注意的小细节
- 如果你用的是.NET Core/.NET 5+,记得在NuGet包里安装
Microsoft.Data.SqlClient;如果是.NET Framework,直接引用System.Data.SqlClient就行。 - 一定要把连接字符串、SQL查询里的表名和字段替换成你自己的实际内容哦!
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

