2010-07-25 94 views
2

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

让我们假设,我在databes两个表:

表的用户:

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,和两个用于填充数据集的DataAdaptersdaUsers,daWorkplaces)。对此我进行

代码:

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

在这一点上我在dgvUsers三列,用户名,用户名和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值。

谢谢你的时间。

回答

1

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

Per 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书籍,可以发现这应该起作用,尽管我还没有尝试过。但我不确定这是否与您之前建议的想法太接近,因此您击落了。

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

+0

谢谢,我在考虑ComboBox和TextBox在他们的行为/属性上是相似的。我错了。 – Wodzu 2010-07-26 06:38:51

1

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

例如。

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

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

+1

感谢您的想法,但我不想这样做。我想要的就是我在我的问题中描述的内容。 – Wodzu 2010-07-25 19:02:47

3

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

相关问题