如何在 C# 中以 format 的形式存储临时信息?

发布:2024-10-29 08:59 阅读:21 点赞: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应用程序中。这样做的好处在于提高了代码的可维护性、类型安全性和易于扩展性。