0

我有一个 CheckedListbox,其中包含一些名为 products 的表中的值。这个想法是检查与客户关联的产品。现在它确实正确保存在链接表中,但是当再次加载它时,被检查的项目没有正确加载到 CheckedListbox 中。

所以从那个链接表中,我想从一列中获取所有行。所有表都已加载到应用程序中,所以我不想使用 sql。

我试过使用 linq,但没有成功,Ids 在这里只是空的。

int[] Ids = (from m in dataset.Tables["LinkTable"].AsEnumerable()
                where m.Field<int>("customerId") == customerId
                select m.Field<int>("productId")).ToArray();

然后,如果我确实成功获得了这些 ID,我想获得这些主键的索引,以便我可以将正确的产品设置为checked. 我已经厌倦了这样做,但这会给程序的其他部分带来错误,因为我正在为全局数据表设置主键。Datagridviews 不喜欢这样。

        DataColumn[] keyColumns = new DataColumn[1]; 
        keyColumns[0] = dataset.Tables["products"].Columns["Id"];
        currentPatient.GetTheDataSet.Tables["products"].PrimaryKey = keyColumns;

        foreach (int Id in Ids)
        {
            DataRow row = dataset.Tables["Products"].Rows.Find(Id);
            int index = dataset.Tables["Products"].Rows.IndexOf(row);
            clbMedications.SetItemChecked(index, true);

        }

我想在不指定主键的情况下完成最后一部分,我在 linq 中找不到如何做到这一点。

我知道它由 2 个问题组成,但也许这可以只用一个 linq 语句来完成,所以我最好将它们结合起来。

4

1 回答 1

1

[编辑]

最后,我想我已经得到了你需要的东西:

var qry = (from p in ds.Tables["products"].AsEnumerable()
    select new {
        Id = p.Field<int>("Id"),
        Index = ds.Tables["products"].Rows.IndexOf(p),
        Checked = ds.Tables["LinkTable"].AsEnumerable().Any(x=>x.Field<int>("productId") == p.Field<int>("Id") && x.Field<int>("customerId")==customerid)
    }).ToList();

上面的查询返回列表,您可以使用CheckedListbox对其进行 bnid 。

于 2015-01-08T14:23:18.970 回答