繁体   English   中英

如何在DataGridView中创建LookUp字段?

[英]How to create LookUp fields in DataGridView?

在我的DataGridView我从一个表中显示了一列列。 在这个表中,我有一个列指向另一个表中的项目。 正如您可能已经猜到的那样,我想在一列中的网格中显示第二个表中的一些文本值而不是和ItemID。 我在网上找不到一个正确的例子如何做到这一点。

让我们假设我在数据库中有两个表:

表用户:

UserID UserName UserWorkplaceID
  1     Martin        1
  2     John          1
  3     Susannah      2
  4     Jack          3

表工作场所:

WorkplaceID WorkplaceName
     1        "Factory"
     2        "Grocery"
     3        "Airport"

我有一个无类型数据集dsUsers ,一个绑定源bsUsers和两个DataAdapters用于填充数据集( daUsersdaWorkplaces )。

我正在执行的代码:

daUsers.Fill(dsUsers);
daWorkplaces.Fill(dsUsers);
bsUsers.DataSource = dsUsers.Tables[0];
dgvUsers.DataSource = bsUsers;

此时我在dgvUsers看到三列,UserID,UserName和UserWorkplaceID。 但是,我希望看到“工厂”,“杂货”等等,而不是UserWorkplaceID和值1,2,3 ...

所以我在dgvUsers添加了另一个名为“WorkplaceName”的列,在我的代码中我试图将它绑定到新创建的关系:

dsUsers.Relations.Add("UsersWorkplaces", dsUsers.Tables[1].Columns["WorkplaceID"], dsUsers.Tables[0].Columns["UserWorkplaceID"]);

WorkplaceName.DataPropertyName = "UsersWorkplaces.WorkplaceName";

不幸的是,这不起作用。 创建关系时没有错误,但运行程序后此列中的字段为空。

我做错了什么?

我还想问一下DataGridView中使用LookUp组合框的示例,它允许我更改UserWorkplaceID,但是它将显示一个在WorkplaceName下的tex值而不是数值。

谢谢你的时间。

在我看来,最好的决定是使用DataGridViewComboBoxColumn列类型。 如果这样做,您应该事先创建一个包含查找数据的数据适配器,然后设置DataGridViewComboBoxColumn的DataSource,DataPropertyName,DisplayMember和ValueMember属性。 您还可以将DisplayStyle属性设置为Nothing,以使列看起来像公共数据列。 而已。

我不知道你是否可以做你想要的,这似乎是将DataGridView同时绑定到两个不同的DataTable实例。 我不认为DataGridView类支持 - 或者如果它这样做是一个忍者风格的举动,我没有看到。

根据MSDN ,您最好的选择可能是使用DataGridView上的CellFormatting事件并检查格式化的单元格何时位于查找列中,然后您可以替换其他表中的值。 对WorkplaceName列使用未绑定列,隐藏UserWorkplaceID列,然后实现CellFormatting事件句柄以查找行中的值,例如:

private void dgv_CellFormatting(object sender, 
    DataGridViewCellFormattingEventArgs e)
{
    if (dgv.Columns[e.ColumnIndex].Name.Equals("WorkplaceName")
    {
        // Use helper method to get the string from lookup table
        e.Value = GetWorkplaceNameLookupValue(
            dataGridViewScanDetails.Rows[e.RowIndex].Cells["UserWorkplaceID"].Value);
    }
}

如果你看到很多行,这可能会影响性能,但可能是让它运行起来的一种不错的方法。

如果这对您没有吸引力,可以使用DataTable.Merge()方法将查找表合并到主表中。 快速浏览一下我的ADO.NET书籍表明这应该有效,尽管我还没有尝试过。 但是我不确定这是否与之前提出的你击落的想法太接近了。

至于你关于查找组合框的第二个问题,你应该把它发布在一个单独的问题中,以便得到适当的关注。

您可以让SQL完成工作。 使用连接返回具有Workplace名称而不是ID的表,将该表输出到数据集中并使用它。

例如。

SELECT A.UserID, A.UserName, B.WorkplaceID
   FROM Users A 
   JOIN Workplaces B ON A.UserWorkplaceID = B.WorkplaceID

然后使用其输出来填充dsUsers。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM