3

在我的表格中,我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用于填充数据集 ( daUsers, daWorkplaces)。

我正在执行的代码:

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 值。

谢谢你的时间。

4

3 回答 3

3

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

于 2015-12-28T09:17:57.413 回答
2

我不知道您是否可以完全按照您的意愿行事,这似乎将 DataGridView 同时绑定到两个不同的DataTable实例。我不认为DataGridView班级支持这一点——或者如果支持的话,那是我从未见过的忍者风格的举动。

根据 MSDN,您最好的选择可能是使用CellFormattingDataGridView 上的事件并检查正在格式化的单元格何时在查找列中,然后您可以从另一个表中替换您的值。为 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 书籍表明这应该可行,尽管我还没有尝试过。但是我不确定这是否与您之前提出的想法太接近了。

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

于 2010-07-26T00:39:37.200 回答
1

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

例如。

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

然后使用它的输出来填充 dsUsers。

于 2010-07-25T17:28:28.713 回答