C# WPF 如何实现DataGrid选中行全量数据(含未展示字段)填充文本框
实现方案
1. 定义Owner实体类映射表字段
首先创建和owners表完全对应的实体类,所有字段(包括DataGrid未展示的字段)都要定义为公共属性:
public class Owner { // DataGrid已展示字段 public string name { get; set; } public string last_name { get; set; } public string national_code { get; set; } public string father_name { get; set; } public string mobile { get; set; } // 补充所有DataGrid未展示的字段,和表结构一一对应即可 public string address { get; set; } public DateTime? birthday { get; set; } // 其余字段按实际表结构补全 }
2. 改造查询逻辑,修复SQL注入风险并绑定实体集合
你原来的SQL是字符串拼接写法,存在严重SQL注入风险,改为参数化查询,同时将查询结果转为List<Owner>绑定到DataGrid:
List<Owner> ownerList = new List<Owner>(); // 用参数化查询避免注入 MySqlCommand cmd = new MySqlCommand("SELECT * FROM owners WHERE name=@name OR last_name=@lastName", conn); cmd.Parameters.AddWithValue("@name", namesearch); cmd.Parameters.AddWithValue("@lastName", lastnamesearch); using (MySqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { Owner owner = new Owner(); owner.name = reader["name"].ToString(); owner.last_name = reader["last_name"].ToString(); owner.national_code = reader["national_code"].ToString(); owner.father_name = reader["father_name"].ToString(); owner.mobile = reader["mobile"].ToString(); // 读取所有未展示字段赋值 owner.address = reader["address"]?.ToString(); owner.birthday = reader.IsDBNull("birthday") ? null : reader.GetDateTime("birthday"); // 其余字段按实际情况补全赋值 ownerList.Add(owner); } } // 绑定数据到DataGrid,替换你原来的绑定逻辑 yourDataGrid.ItemsSource = ownerList;
3. 绑定DataGrid选中事件实现文本框填充
首先在XAML的DataGrid标签中添加SelectionChanged事件声明:
<DataGrid x:Name="yourDataGrid" SelectionChanged="yourDataGrid_SelectionChanged" <!-- 保留你原来的其余属性、列定义不变 --> > </DataGrid>
在后台cs文件中实现事件逻辑:
private void yourDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { // 校验选中行是否有效 if (yourDataGrid.SelectedItem is Owner selectedOwner) { // 给所有对应文本框赋值,未在DataGrid展示的字段也可以直接取实体属性赋值 txtName.Text = selectedOwner.name; txtLastName.Text = selectedOwner.last_name; txtNationalCode.Text = selectedOwner.national_code; txtFatherName.Text = selectedOwner.father_name; txtMobile.Text = selectedOwner.mobile; txtAddress.Text = selectedOwner.address; dpBirthday.SelectedDate = selectedOwner.birthday; // 其余字段按你实际创建的文本框名称补全即可 } else { // 可选:未选中行时清空所有文本框 foreach (var tb in this.Children.OfType<TextBox>()) { tb.Clear(); } } }
如果你之前是用DataTable直接绑定DataGrid,不想改造为实体类的话,事件逻辑可以简化为:
private void yourDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (yourDataGrid.SelectedItem is DataRowView row) { // 直接通过字段名取值,不管有没有在DataGrid展示都能拿到 txtName.Text = row["name"].ToString(); txtAddress.Text = row["address"].ToString(); // 其余字段按实际字段名补全即可 } }
内容的提问来源于stack exchange,提问作者Arsalan Ahmadi
相关产品推荐
相关产品推荐

