代码之家  ›  专栏  ›  技术社区  ›  Wodzu

如何在DataGridView中创建查找字段?

  •  3
  • Wodzu  · 技术社区  · 15 年前

    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

    所以我在这里又加了一个专栏 DGV用户 在我的代码中,我试图将其绑定到新创建的关系:

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

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

    我做错了什么?

    我还想问一个DataGridView中LookUp combobox的例子,它允许我更改userworkpaceid,但是它将显示workpacename下的tex值,而不是数字值。

    谢谢你的时间。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Matt    15 年前

    我不知道你是否可以做你想做的,这似乎是绑定到两个不同的DataGridView DataTable DataGridView 类支持这一点——或者如果支持的话,这是一个我没见过的忍者风格的动作。

    Per MSDN ,您的最佳选择可能是使用 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书籍,就会发现这应该是可行的,尽管我还没有尝试过。但我不确定这是否与你之前提出的想法过于接近。

        2
  •  3
  •   Vasily Ivanov    10 年前

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

        3
  •  1
  •   Hari Menon    15 年前

    你可以让SQL来代替。使用join返回工作区名称而不是id的表,将该表输出到数据集中并使用它。

    如。

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

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

    推荐文章