在CollectionView中按ID获取项目

时间:2015-02-13 17:49:05

标签: c# wpf collectionview

我正在编写连接到本地Access数据库的WPF应用程序。在其中一个应用程序屏幕中,一个表格数据(名为Service)显示在单个文本框中,如表单,用户可以浏览记录,创建新记录,删除,编辑或搜索。一切都在同一张桌子上完成。

在深入研究如何浏览文本框中显示的记录之后,我最终使用了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?

1 个答案:

答案 0 :(得分:0)

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

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

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

    return null;
}

然后您可以在CollectionView中选择对象:

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

当然,您可以使用foreach周期或DataRow的{​​{1}}方法找到真实的Select索引。