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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:05