你好,我刚刚升级到Framework 4.0,并在我的数据库中添加了关系外键。 我想连接两个表User和Staff
并返回到UI。 Staff表具有UserId。 需要注意的是,每当在datagridview上单击用户名时,我都希望将User和Staff数据显示到所有文本框中。
我使用元组来完成此操作。
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只显示用户名。员工表将存储密码、加入日期等字段。
另外,由于我已经向表中添加了外键引用,所以我是否仍需要连接表?我认为它应该足够智能,可以返回User.Staff.Password。
编辑
这就是我找到的...
我已经向我的数据库添加了关系外键。
下面的代码已经能够将User和Staff数据作为Staff.UserId指向UserId而返回给我了。
我不必使用TUPLE来返回那些对象:)!
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数据网格时遇到了问题。
private void InitializeData()
{
gvUser.DataSource = user.Get();
}
这段代码可以展示用户数据。但是当我执行
gvUser_RowEnter
时,如何获取回员工数据呢?
private void gvUser_RowEnter(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex <= 0) return;
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
出现了以下错误:无法访问已释放的对象。对象名称:"DataContext accessed after Dispose."。
当我在User中添加Watch Staff对象时,我可以看到隐藏的数据((User)(row.DataBoundItem)).Staffs.entities.Items,其中包含员工数据。