如何在 C# 中以 format 的形式存储临时信息?
阅读:14
点赞:0
一. 引言
在开发应用程序时,经常需要处理来自数据库的数据或者在内存中临时存储数据。DataTable
类作为 System.Data
命名空间的一部分,提供了一个类似于关系型数据库表的数据结构。通过继承 DataTable
类并添加特定功能,可以创建更加符合应用需求的数据结构。本文将详细介绍如何通过继承 DataTable
并扩展其功能来创建一个学生信息表,并展示如何在WPF应用程序中使用这个表格。
二. 步骤一:开发基础类
2.1 目标
创建一个基础类 StudentBaseTable
,它继承自 DataTable
,用于初始化数据表的基本列。
// 使用必要的命名空间
using System.Data;
// 定义一个继承自 DataTable 的新类
namespace DatatableStructureExample
{
// 基础类用于设置数据表的基本属性
internal class StudentBaseTable : DataTable
{
// 构造函数接受一个字符串参数作为表名
public StudentBaseTable(string tableName) : base(tableName)
{
// 初始化表中的列
InitializeColumns(); // 调用初始化列的方法
}
// 虚方法用于设置共享的列
protected virtual void InitializeColumns()
{
// 添加所有子类都将使用的标准列
this.Columns.Add("UserId", typeof(int)); // 添加名为 UserId 的整数类型列
this.Columns.Add("UserName", typeof(string)); // 添加名为 UserName 的字符串类型列
}
// 方法用于设置主键
public void SetPrimaryKey(string columnName)
{
// 设置主键为指定的列
this.PrimaryKey = new DataColumn[] { this.Columns[columnName] }; // 设置主键
}
}
}
三. 步骤二:开发派生类
3.1 目标
创建一个派生类 StudentInformationTable
,该类将定义具体的学生信息表格,并提供管理学生信息的方法。
// 使用必要的命名空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DatatableStructureExample
{
// 派生类继承自基础类,用于定义具体的列并提供特定的方法
internal class StudentInformationTable : StudentBaseTable
{
// 构造函数接受一个字符串参数作为表名
public StudentInformationTable(string tableName) : base(tableName)
{
// 添加子类特有的列
this.Columns.Add("UserAge", typeof(int)); // 添加名为 UserAge 的整数类型列
this.Columns.Add("UserAddress", typeof(string)); // 添加名为 UserAddress 的字符串类型列
this.SetPrimaryKey("UserId"); // 设置 UserId 为主键
}
// 方法用于向表中添加一条学生记录
public void AddStudentInformation(int userId, string userName, int userAge, string userAddress)
{
// 创建一个新的数据行
DataRow row = this.NewRow();
row["UserId"] = userId; // 设置 UserId
row["UserName"] = userName; // 设置 UserName
row["UserAge"] = userAge; // 设置 UserAge
row["UserAddress"] = userAddress; // 设置 UserAddress
this.Rows.Add(row); // 向表中添加新行
}
// 方法用于删除指定ID的学生记录
public void RemoveStudentInformationById(int id)
{
// 查找指定ID的行
DataRow row = this.Rows.Find(id);
if (row != null)
{
this.Rows.Remove(row); // 删除找到的行
}
}
}
}
四. 步骤三:集成到WPF应用程序中
4.1 目标
集成 StudentInformationTable
类到WPF应用程序中,以便用户能够创建、删除学生记录,并查看当前记录列表。
4.1.1 UI视图
<Window x:Class="DatatableStructureExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DatatableStructureExample"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<StackPanel Margin="10" Orientation="Vertical">
<!-- 用户ID输入框 -->
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="User ID:" VerticalAlignment="Center" Width="100"/>
<TextBox x:Name="UserIdTextBox" Width="200"/>
</StackPanel>
<!-- 用户姓名输入框 -->
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="User Name:" VerticalAlignment="Center" Width="100"/>
<TextBox x:Name="UserNameTextBox" Width="200"/>
</StackPanel>
<!-- 用户年龄输入框 -->
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="User Age:" VerticalAlignment="Center" Width="100"/>
<TextBox x:Name="UserAgeTextBox" Width="200"/>
</StackPanel>
<!-- 用户地址输入框 -->
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="User Address:" VerticalAlignment="Center" Width="100"/>
<TextBox x:Name="UserAddressTextBox" Width="200"/>
</StackPanel>
<!-- 删除用户ID输入框 -->
<StackPanel Orientation="Horizontal" Margin="0,5">
<TextBlock Text="Remove Id:" VerticalAlignment="Center" Width="100"/>
<TextBox x:Name="RemoveIdTextBox" Width="200"/>
</StackPanel>
</StackPanel>
<StackPanel Orientation="Horizontal">
<!-- 创建学生记录按钮 -->
<Button x:Name="BtnCreateRow" Content="Create Row" Height="40" Width="200" Click="BtnCreateRow_Click" Margin="30,0,0,0"/>
<!-- 删除学生记录按钮 -->
<Button x:Name="BtnDeleteRow" Content="Delete Row" Height="40" Width="200" Click="BtnDeleteRow_Click" Margin="20,0,0,0"/>
<!-- 显示学生记录列表按钮 -->
<Button x:Name="BtnShowDetails" Content="Show Details" Height="40" Width="200" Click="BtnShowDetails_Click" Margin="20,0,0,0"/>
</StackPanel>
<!-- 数据显示区 -->
<DataGrid x:Name="dataGrid" AutoGenerateColumns="True" Margin="10,252,10,10"/>
</Grid>
</Window>
4.1.2 代码实现
using System.Collections.ObjectModel;
using System.Data;
using System.Windows;
using System.Windows.Controls;
namespace DatatableStructureExample
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
// 学生信息表实例
StudentInformationTable studentInformation;
// 观察者集合,用于绑定 DataGrid 控件
private ObservableCollection<DataItemModel> dataItems = new ObservableCollection<DataItemModel>();
public MainWindow()
{
InitializeComponent();
// 创建学生信息表实例
studentInformation = new StudentInformationTable("StudentTable");
}
// 创建学生记录按钮点击事件
private void BtnCreateRow_Click(object sender, RoutedEventArgs e)
{
// 创建一条新的学生记录
studentInformation.AddStudentInformation(
Convert.ToInt32(UserIdTextBox.Text),
UserNameTextBox.Text,
Convert.ToInt32(UserAgeTextBox.Text),
UserAddressTextBox.Text);
}
// 删除学生记录按钮点击事件
private void BtnDeleteRow_Click(object sender, RoutedEventArgs e)
{
// 根据用户输入的ID删除学生记录
studentInformation.RemoveStudentInformationById(Convert.ToInt32(RemoveIdTextBox.Text));
}
// 显示学生记录列表按钮点击事件
private void BtnShowDetails_Click(object sender, RoutedEventArgs e)
{
// 清空 DataGrid 中的显示内容
dataGrid.ItemsSource = null;
// 清空观察者集合
if (dataItems.Count > 0)
{
dataItems.Clear();
}
// 遍历所有学生记录,填充观察者集合
foreach (DataRow item in studentInformation.Rows)
{
if (item != null)
{
var dataItemModel = new DataItemModel
{
Column1 = item[0].ToString(),
Column2 = item[1].ToString(),
Column3 = item[2].ToString(),
Column4 = item[3].ToString()
};
// 添加项到绑定至 DataGrid 的集合中
dataItems.Add(dataItemModel);
}
}
// 绑定观察者集合至 DataGrid
dataGrid.ItemsSource = dataItems;
}
}
}
五. 实现结果
5.1 创建学生记录功能
此功能允许用户输入学生的 ID、姓名、年龄以及地址信息,并将其添加到 DataTable
中。
5.2 删除学生记录功能
此功能允许用户输入一个学生 ID,如果存在与之匹配的记录,则将其从 DataTable
中移除。
5.3 显示学生记录详情功能
此功能显示所有已添加到 DataTable
中的学生记录,并且可以通过 DataGrid 控件直观地查看这些记录。
通过上述步骤,我们不仅创建了一个具有特定功能的学生信息表,而且还成功地集成了该表格到一个功能齐全的WPF应用程序中。这样做的好处在于提高了代码的可维护性、类型安全性和易于扩展性。