【问题标题】:DataBind to specific records数据绑定到特定记录
【发布时间】:2010-10-02 08:07:38
【问题描述】:

我有一个绑定到这个表的 DataGridView:

[Users]
ID Name
-- ----
11 Qwe
22 Asd

网格直接绑定到类型化的数据集表。

我有第二张这样的桌子:

[Records]
ID  UserID  Data
--  ------  ----
67  11      ....
68  11      ....

Records.UserID 使用外键连接到用户。

我想要做的是:当用户双击用户 #11 时,我打开一个新网格,绑定到 [Records] 表,但只绑定到 UserID = 11 的行。双击、获取 ID、新网格等是好的。如果我这样做与 sprocs 连接,我不会有任何问题,但我希望它被绑定,我根本不知道如何做到这一点。

你能给我一些想法吗?

【问题讨论】:

    标签: data-binding datagridview bindingsource


    【解决方案1】:

    如果您使用的是 DataSets/DataTables,那么您可以执行以下操作来过滤第二个网格的行:

    string filter = String.Format("UserID = {0}", selectedUserId);
    grdRecords.DataSource = ds.Tables["Records"].Select(filter);
    

    我相信您可以编辑返回的数组中的记录,但您将无法向此集合添加/删除新项目。您必须将它们添加到常规表中,然后重新过滤网格。

    当然,还有很多其他方法可以做到这一点。如果您使用从 IBindingListView 派生的对象,例如 DataView 类的实例,您应该有权访问 Filter 属性。然后你可以这样做:

    string filter = String.Format("UserID = {0}", selectedUserId);
    DataView myView;
    grdRecords.DataSource = myView;
    myView.Filter = filter;
    

    您的视图将保持过滤状态以匹配您放入其中的任何数据。

    希望这篇文章足够清晰,让您能够弄清楚细节......我今天有点散漫。 :)

    【讨论】:

    • 感谢您的想法。过滤器的问题是它首先检索所有记录然后过滤。所以记录很多的时候会有点慢。
    • 不一定。编写一种机制来检查数据表以查看它是否包含某个用户 ID 的任何记录,如果没有,则运行带有 WHERE 子句的 SQL 语句,并将这些行附加到表中。然后进行过滤。这将提供一种缓存机制,并且只提取您需要的内容。
    【解决方案2】:

    最后我不得不这样做:

    1. 创建一个 DB 类,其公共属性 (MyDataSetProperty) 返回 typedDataset

    2. 在 DataSet 中创建一个接受 Id 参数的自定义 Fill 函数。

    3. 使用该函数填充私有类型数据集中的表

      this.myTableAdapter.FillCustom(this.myTypedDataset.MyTable, this.Id);

    4. 将 bindingSource 绑定到此公共属性:

      this.bindingSource.DataSource = this.db.MyDataSetProperty;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      相关资源
      最近更新 更多