在 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循环或者DataTable
的Select
方法找到真正的DataRow
索引。
我正在编写连接到本地 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循环或者DataTable
的Select
方法找到真正的DataRow
索引。