在 CollectionView 中通过 ID 获取项目

Get item by ID in a CollectionView

我正在编写连接到本地 Access 数据库的 WPF 应用程序。在其中一个应用程序屏幕中,一个 table 数据(名为服务)显示在单独的文本框中,就像一个表单,用户可以浏览记录、创建新记录、删除、编辑或搜索。一切都在同一个 table.

上完成

在对如何浏览文本框中显示的记录进行深入研究后,我最终使用了 DataSet 和 CollectionView。

public partial class Entries : Window
{
    AgendaDataSet agendaDataSet = new AgendaDataSet();
    AgendaDataSetTableAdapters.ServiceTableAdapter serviceAdapter = new AgendaDataSetTableAdapters.ServiceTableAdapter();
    CollectionView workSheetView;

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {                         
        this.serviceAdapter.FillByDateAsc(agendaDataSet.Service);                
        this.DataContext = agendaDataSet.Service;
        this.workSheetView = (CollectionView)CollectionViewSource.GetDefaultView(agendaDataSet.Service);
        this.workSheetView.MoveCurrentToLast();                                  
    }

我使用 CollectionView 方法 MoveCurrentToFirst()、MoveCurrentToNext() 等进行记录导航。我还可以创建新记录、编辑和删除。

这是我用来创建新记录的方法:

    private void btnNovo_Click(object sender, RoutedEventArgs e)
    {            
        dynamic row = this.agendaDataSet.Service.NewMainRow();            
        this.agendaDataSet.Service.AddMainRow(row);
        this.workSheetView.MoveCurrentToLast();
    }

我的问题是记录搜索。我有一个按钮,当用户按下它时,它会询问他正在搜索的 PatientName。然后,有关该患者的数据必须出现在各种文本框中,随时可以查阅、编辑或删除。

通过 CollectionView,我只找到了 GetItemAt() 方法,它根据行索引获取记录。由于我使用的是 Access 数据库,因此无法使用谓词 ROW_NUMBER。我不认为这种方法是最好的。

那么,如何根据项目的 ID、PatientName 或任何其他字段获取项目,并将其作为一行传递给 CollectionView?

您可能不需要根据 ID 或 PatientName 获取项目 属性。 假设用户查找 "Andrew" 作为 PatientName。您的代码发现您的 DataTable(称为 "Service")的第二行是用户要查找的行。

您可以使用一个简单的静态方法来查找 DataRowView,如下所示:

private static DataRowView FindDataRowView(DataView dataView, DataRow dataRow)
{
    foreach (DataRowView dataRowView in dataView)
    {
        if (dataRowView.Row == dataRow)
        {
            return dataRowView;
        }
    }

    return null;
}

然后您可以 select 您的 CollectionView 中的对象:

collectionView.MoveCurrentTo(FindDataRowView(agendaDataSet.Service.DefaultView,
    agendaDataSet.Service.Rows[2]));

当然可以通过foreach循环或者DataTableSelect方法找到真正的DataRow索引。