您刚刚升级到Framework 4.0并将关系外键添加到我的数据库中。我想加入2表User and Staff
并返回UI。员工表具有UserId。不得不说,每当在datagridview上点击用户名时,我想向所有文本框显示用户和员工数据。
我使用Tuple
执行此操作 public IEnumerable<Tuple<User, Staff>> Get()
{
using (qDataContext db = new qDataContext())
{
try
{
var r = from u in db.Users
join s in db.Staffs on u.Id equals s.UserId
select new Tuple<User, Staff>(u, s);
return r;
}
catch (Exception ex)
{
throw;
}
}
}
但是在UI中,我该如何进行绑定?
gvUser.DataSource = user.Get();
仅供参考,gridview只显示用户名。员工表将存储密码,datejoined字段..
顺便说一下,我是否还需要连接表格,因为我已经添加了对表格的外键引用...我在想它应该足够聪明地返回我User.Staff.Password
修改的
这就是我发现的......
我已将关系外键添加到我的数据库中。
当Staff.UserId指向UserId时,下面的代码已经能够返回User和Staff数据
And i don have to use the TUPLE to return those object :)!!
public IEnumerable<User> Get()
{
using (ZebraDataContext db = new ZebraDataContext())
{
try
{
var r = from u in db.Users
select u;
//join s in db.Staffs on u.Id equals s.UserId
//select new Tuple<User, Staff>(u, s);
return r.ToList();
}
catch (Exception ex)
{
throw;
}
}
}
但是,当我绑定到GUI datagridview时,我遇到了麻烦。
private void InitializeData()
{
gvUser.DataSource = user.Get();
}
此代码能够显示用户数据。但是当我执行gvUser_RowEnter
时,如何取回员工数据?
private void gvUser_RowEnter(object sender,DataGridViewCellEventArgs e) { if(e.RowIndex&lt; = 0)返回;
foreach (DataGridViewRow row in gvUser.SelectedRows)
{
User user = row.DataBoundItem as User;
txtName.Text = user.Name;
txtAddress.Text = user.Address;
txtPhone.Text = user.Phone;
txtPhone2.Text = user.Phone2;
txtRemark.Text = user.Remarks;
txtPassword.Text = user.Staffs.First().Password;
}
}
txtPassword.text = user.Staffs.First().Password
&lt; ==此错误失败
无法访问已处置的对象。
对象名:'Dispose后访问的DataContext。'。
当我在User中添加监视Staff对象时。我可以看到隐藏的数据 ((User)(row.DataBoundItem))。Staffs.entities.Items这有人员数据..
答案 0 :(得分:3)
而不是返回一个Tuple
,不会返回一个匿名对象吗?它可能看起来像这样:
var r = from u in db.Users
select new { u.Name,
u.Address,
...,
(from s in db.Staffs select s.Password where u.Id == s.UserId)
};
答案 1 :(得分:1)
如果你想绑定复杂类型,你应该考虑DescriptorProviders。这是一些类似的例子http://www.ureader.com/msg/14411105.aspx。