65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF - 使用 Linq to XML 处理 XML 文件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.89/5 (10投票s)

2008年11月30日

CPOL

6分钟阅读

viewsIcon

101599

downloadIcon

2297

构建 WPF ListView 应用程序以使用 Linq to XML 读取 XML 文件。

引言

我一直在使用 Lawson M3 ERP 软件(以前称为 Intentia Movex),并且喜欢探索开发者可用的新技术。

M3 软件拥有最佳的数据库模型设计之一,并且托管在 IBM System AS/400(iSeries 或 System i)的稳定平台上。我正在使用 Microsoft.Net 2.0 或更高版本来开发与 Lawson M3 数据库和 API 的自定义集成解决方案,以满足业务需求。

最近,我参加了在罗利(2008 年 11 月 15 日)举行的代码营,并对 Karl Shifflett(http://karlshifflett.wordpress.com/)的开幕演讲印象深刻。这启发了我开始写作,并与开发人员社区分享我的知识和经验。Karl 使用 Microsoft Visual Studio 2008 和 .NET 3.5 进行了两次关于 WPF 的演讲。我决定探索和学习 WPF(Windows Presentation Foundation),并将其应用于 Lawson M3 以满足业务需求。

背景

在本文中,我们将学习如何使用 M3 数据库表 OCUSMA(版本 12.4)在 WPF 中构建用户界面 (UI);这是一个包含 226 个字段的客户主数据表。数据层与 UI 层是分开开发的,可以根据可用选项替换为适合需求的层。

数据源可以替换为以下不同选项:

  • ADO.NET(通过 OLE DB、ODBC 连接到 AS/400)
  • M3 提供的 M3 API
  • Web 服务
  • XML 文件

在此演示中,我将使用一个演示 XML 文件 *ocusma.xml* 作为数据源。M3 在其软件中提供了标准的 UI 界面,但许多业务用户需要自定义 UI,允许他们选择适合其业务需求的字段。

下图所示的 XML 文件有一个顶层元素“row”代表记录,子元素表示字段和数据值。在 WPF 中,我们将使用三个字段来演示列表视图。

  • OKCUNO - 客户编号
  • OKCUNM - 客户名称
  • OKPHNO - 电话

Using the Code

要求

  1. Microsoft Windows XP、Vista 或 Windows 2008
  2. Microsoft Visual Studio 2008 SP1
  3. XML 文件 *ocusma.xml*

我正在使用 Windows 2008 和 VS2008 SP1。

步骤 1

启动 VS 2008,并在项目类型 Visual C# 下创建一个新的 WPF 项目。

将项目命名为 Wpf_Customer

单击 OK 按钮继续。

Visual Studio 将创建一个 WPF 应用程序项目框架,我们可以用它来创建我们的应用程序。

Click to enlarge image

第二步

在解决方案资源管理器中,右键单击 *Window1.xaml* 文件,然后从上下文菜单中选择“删除”以删除该文件。我们将添加一个新的 Window (WPF) 文件并将其设置为启动窗口。

右键单击并选择“添加”->“新建项…”

在“类别”中选择 WPF,在“模板”中选择“窗口(WPF)”。

将“名称”字段的值更改为:*CustomerList.xaml*,然后单击“添加”按钮。

Click to enlarge image

步骤 3

从解决方案资源管理器中打开 *App.xaml* 文件。

StartupUri 的值从“*Window1.xaml*”替换为“*CustomerList.xaml*”,将 *CustomerList.xaml* 设置为启动窗口。

步骤 4

按 Ctrl + F5 运行应用程序以检查是否有任何错误。您应该会看到一个空白窗口,没有数据。

单击窗口右上角的 X 图标关闭应用程序。

步骤 5

通过右键单击项目并选择“新建文件夹”来为项目添加一个名为 *DAL* 的新文件夹。

我们将把所有数据访问层代码放在 *DAL* 文件夹中,以读取 *ocusma.xml* 文件中的信息。

通过右键单击项目并选择“现有项…”将 *ocusma.xml* 添加到项目中(该文件包含在下载的 zip 文件中)。

右键单击 *ocusma.xml* 文件,然后从上下文菜单中选择“属性”。

将“生成操作”的值更改为“内容”。

将“复制到输出目录”的值更改为“始终复制”。

这将确保文件被复制到输出目录,并可供 WPF 程序访问。

步骤 6

创建名为 Customer 的类,用于数据访问层和 WPF UI 层存储客户信息。

通过右键单击项目中的 *DAL* 文件夹并选择“新建项…”来添加一个新的类文件。

在“类别”中选择“代码”,在“模板”中选择“类”。

将 `Name` 字段的值更改为 *cCustomer.cs*,然后单击“添加”。这将在 *DAL* 文件夹中添加一个 *cCustomer.cs* 文件。

将以下代码添加到类文件中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace Wpf_Customer.DAL
{
class cCustomer
{
public string OKCUNO { get; set; }
public string OKCUNM { get; set; }
public string OKPHNO { get; set; }
}
// The DAL will read the information from the XML file and load into a List
class DAL_OCUSMA
{
public static List<cCustomer> LoadOCUSMA()
{
List<cCustomer> ListCustomerRecords = new List<cCustomer>();
// Execute the query using the LINQ to XML
var custs = from c in XElement.Load(@"OCUSMA.xml").Elements("row") select c ;
foreach (var customer in custs)
{
cCustomer lCustomer = new cCustomer
{
OKCUNO = customer.Element("OKCUNO").Value,
OKCUNM = customer.Element("OKCUNM").Value,
OKPHNO = customer.Element("OKPHNO").Value
}; 
ListCustomerRecords.Add(lCustomer);
}
return ListCustomerRecords;
}
}
}

类“cCustomer”中的属性 OKCUNOOKCUNMOKPHNO 映射到 OCUSMA 表中的字段。

DAL_OCUSMA 提供一个 static 方法“LoadOCUSMA”,该方法将返回所有客户记录的列表。代码使用 LINQ to XML 读取 *ocusma.xml* 文件并将记录添加到 List 中。

步骤 7

现在是设计 UI 的时候了。通过双击 *CustomerList.xaml* 文件,从解决方案资源管理器中打开它。

将主窗口的宽度从 300 更改为 500。

删除包含 <Grid> </Grid> 的行。这将从 Window 容器中删除 Grid 面板。

添加 <StackPanel> </StackPanel> 行。这将向 Window 容器添加一个堆栈面板。我们现在添加的任何控件或组件都将垂直堆叠。

stackpanel 之间添加一个按钮控件,代码如下:

<Button Height="25” Width="50” Click="Button_Click">Load</Button>

添加以下代码以添加一个 listview 控件。

<ListView Name="listView1" HorizontalAlignment="Left"
	VerticalAlignment="Top" ItemsSource="{Binding}">
<ListView.View>
<GridView >
<GridView.Columns>
<GridViewColumn Width="75" Header="Customer"
	DisplayMemberBinding="{Binding Path=OKCUNO}" />
<GridViewColumn Width="250" Header="Name" 
	DisplayMemberBinding="{Binding Path=OKCUNM}" />
<GridViewColumn Width="125" Header="Telephone"
	DisplayMemberBinding="{Binding Path=OKPHNO}" />
</GridView.Columns>
</GridView> 
</ListView.View>
</ListView>

ListView 的视图将包含三个 GridView 列。每个 GridView 列都通过数据绑定映射到类 cCustomer 的属性 OKCUNOOKCUNMOKPHNO 中指定的字段名。

CustomerList.xaml 应如下所示:

Click to enlarge image

按 Ctrl+F5 运行应用程序。这将显示按钮和 ListView ,但没有数据。

单击窗口右上角的 X 图标关闭应用程序。

步骤 8

通过双击文件,从解决方案资源管理器中打开代码隐藏文件“*CustomerList.xaml.cs*”。

添加一行...

using Wpf_Customer.DAL

...到 `namespace` 行之前。

Button_Click 方法中添加以下行:

“private void Button_Click(object sender, RoutedEventArgs e)”
List<cCustomer> customerList = new List<cCustomer>();
customerList = DAL_OCUSMA.LoadOCUSMA();
listView1.DataContext = customerList;

我们将创建一个名为 customerList List ,并通过调用 DAL_OCUSMAstatic 方法 LoadOCUSMA 来添加 customer 记录。该 list 将被绑定到 ListView 控件 listView1

按 Ctrl + F5 运行应用程序。

单击加载按钮。列表将使用 *ocusma.xml* 中的记录进行填充。

摘要

我们已经看到了如何创建一个 WPF 应用程序,该应用程序将读取 XML 文件并将记录加载到 ListView 控件中。

参考文献

历史

  • 2008 年 11 月 30 日:首次发布
© . All rights reserved.