首页 > 解决方案 > 从 DataGrid 获取单元格值

问题描述

我有一个 DataGrid,里面填充了来自连接的数据。

private void GetTeamData()
{
    DataContext dc = new DataContext(connString);
    Table<Team> tblLag = dc.GetTable<Team>();
    Table<Division> tblDivision = dc.GetTable<Division>();

    var teams = from team in tblLag
                join division in tblDivision on team.Division equals division.Id
                select new
                {
                    name = team.TeamName,
                    beliggenhet = team.Location,
                    arena = team.Arena,
                    division = division.Name
                };

    dgTeams.ItemsSource = teams;
}

我想从选定的行中获取数据并将其放在不同的文本框中。经过大量令人沮丧的谷歌搜索和尝试后,我终于找到了一个可行的解决方案:

private void ShowSelectedTeam(Object sender, RoutedEventArgs args)
{
    GetDivisionNames();
    dgTeams.SelectionUnit = DataGridSelectionUnit.FullRow;
    Object selectedTeam = dgTeams.SelectedItem;

    List<PropertyInfo> props = new List<PropertyInfo>(selectedTeam.GetType().GetProperties());

    tbxTeam.Text = props[0].GetValue(selectedTeam, null).ToString();
    tbxBeliggenhet.Text = props[1].GetValue(selectedTeam, null).ToString();
    tbxArena.Text = props[2].GetValue(selectedTeam, null).ToString();
    cbxDivisions.Text = props[3].GetValue(selectedTeam, null).ToString();
}

问题是这是一种非常复杂的方法来做一些不应该那么困难的事情。对于更简单的代码的建议,我会很高兴。

标签: c#wpflinqdatagrid

解决方案


获取选定项属性非常复杂,因为选定项具有匿名类型。

创建一个类型

public class TeamViewModel
{
    public string name { get; set; }
    public string beliggenhet { get; set; }
    public string arena { get; set; }
    public string division { get; set; }
}

在填充 ItemsSource 时创建该类型的对象:

var teams = from team in tblLag
            join division in tblDivision on team.Division equals division.Id
            select new TeamViewModel
            {
                name = team.TeamName,
                beliggenhet = team.Location,
                arena = team.Arena,
                division = division.Name
            };

并且您将能够将 SelectedItem 转换为具体类型并读取属性而无需反射:

private void ShowSelectedTeam(Object sender, RoutedEventArgs args)
{
    GetDivisionNames();
    dgTeams.SelectionUnit = DataGridSelectionUnit.FullRow;
    var selectedTeam = dgTeams.SelectedItem as TeamViewModel;

    if (selectedTeam == null) return;

    tbxTeam.Text = selectedTeam.name;
    tbxBeliggenhet.Text = selectedTeam.beliggenhet;
    tbxArena.Text = selectedTeam.arena;
    cbxDivisions.Text = selectedTeam.division;
}

如果您仍想继续使用匿名类型,您可以使用dynamictype 来读取值(仅ShowSelectedTeam更改方法):

private void ShowSelectedTeam(Object sender, RoutedEventArgs args)
{
    GetDivisionNames();
    dgTeams.SelectionUnit = DataGridSelectionUnit.FullRow;
    dynamic selectedTeam = dgTeams.SelectedItem;

    if (selectedTeam == null) return;

    tbxTeam.Text = selectedTeam.name.ToString();
    tbxBeliggenhet.Text = selectedTeam.beliggenhet.ToString();
    tbxArena.Text = selectedTeam.arena.ToString();
    cbxDivisions.Text = selectedTeam.division.ToString();
}

推荐阅读