c# - 从 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();
}
问题是这是一种非常复杂的方法来做一些不应该那么困难的事情。对于更简单的代码的建议,我会很高兴。
解决方案
获取选定项属性非常复杂,因为选定项具有匿名类型。
创建一个类型
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;
}
如果您仍想继续使用匿名类型,您可以使用dynamic
type 来读取值(仅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();
}
推荐阅读
- python - Python SQLite3函数不打印任何数据
- urxvt - urxvt 将 Shift-PgUp/Shift-PgDown 重新映射到 Shift-Control-PgUp/PgDown
- php - 如何检查任何 WooCommerce 订单是否包含产品 ID?
- c - 传递对 C 中函数的引用
- java - Google Games 可怕的登录权限:“创建、编辑和删除您的 Google Play 游戏活动”
- c# - 错误:目标 11 不允许选项 --boot-class-path
- python - 读取 Dataframewriter Pyspark 编写的 Csv 文件
- javascript - 如何将变量的值从子组件发送到父组件?
- c - gcc 选项:pkg-config --libs --cflags gtk+-3.0
- python - 如何使用python中的标题提取文本文件中的特定行并在函数中返回它?