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

科技   2024-10-30 07:16   北京  
在 C# 中,DataTable 类位于 System.Data 命名空间中,用于表示存储在内存中的数据表。该类允许创建、操作和与数据进行交互,并以行和列的形式呈现数据,类似于关系型数据库表。在应用程序中,它通常用于临时存储从数据库获取的数据,或在内存中处理数据。这种方法特别适用于需要增强 DataTable 基础功能的场景,例如添加特定功能、预定义的架构(列)或自定义的数据操作方法。

该方法的优点

  1. 自定义功能:可以通过添加特定于应用领域的方法和约束来增强 DataTable
  2. 预定义的架构:通过子类定义特定的列和主键,从而减少代码中的架构重复。
  3. 增强类型安全:通过在类中整合逻辑,提升代码的可维护性和类型安全性。

详细示例 - 按步骤实现

第 1 步:开发派生自 DataTable 的基础类

基础类用于初始化 DataTable,例如设置列。此外,还可以在其中添加子类可以使用的公共方法或逻辑。

using System.Data;

namespace DatatableStructureExample
{
    internal class StudentBaseTable : DataTable
    {
        string rowString = string.Empty;

        public StudentBaseTable(string tableName) : base(tableName)
        {
            // 在基础类中设置列
            InitializeColumns();
        }

        // 设置公共列的过程
        protected virtual void InitializeColumns()
        {
            // 设置所有派生类使用的标准列
            this.Columns.Add("UserId"typeof(int));
            this.Columns.Add("UserName"typeof(string));
        }

        // 设置主键列的过程
        public void SetPrimaryKey(string columnName)
        {
            this.PrimaryKey = new DataColumn[] { this.Columns[columnName] };
        }
    }
}
第 2 步:开发指定特定表的派生类

派生类(例如 StudentInformationTable)将为数据表定义特定的列,并可能加入额外的用于管理 StudentInformationTable 数据的方法。

using System.Data;

namespace DatatableStructureExample
{
    internal class StudentInformationTable : StudentBaseTable
    {
        public StudentInformationTable(string tableName) : base(tableName)
        {
            this.Columns.Add("UserAge"typeof(int));
            this.Columns.Add("UserAddress"typeof(string));
            this.SetPrimaryKey("UserId");
        }

        // 添加学生信息的过程
        public void AddStudentInformation(int userId, string userName, int userAge, string userAddress)
        {
            DataRow row = this.NewRow();
            row["UserId"] = userId;
            row["UserName"] = userName;
            row["UserAge"] = userAge;
            row["UserAddress"] = userAddress;
            this.Rows.Add(row);
        }

        // 根据学号删除学生信息的过程
        public void RemoveStudentInformationById(int id)
        {
            DataRow row = this.Rows.Find(id);
            if (row != null)
            {
                this.Rows.Remove(row);
            }
        }
    }
}
第 3 步:在应用中使用 StudentInformationTable

现在可以在应用程序中实例化 StudentInformationTable 表,添加记录并展示数据。在这里,我使用 WPF 应用来展示 DataTable,可以根据需求进行自定义。

界面视图
<Window x:Class="DatatableStructureExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        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>
后端实现
using System.Collections.ObjectModel;
using System.Data;
using System.Windows;

namespace DatatableStructureExample
{
    public partial class MainWindow : Window
    {
        StudentInformationTable studentInformation;
        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)
        {
            studentInformation.RemoveStudentInformationById(Convert.ToInt32(RemoveIdTextBox.Text));
        }

        private void BtnShowDetails_Click(object sender, RoutedEventArgs e)
        {
            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()
                    };
                    dataItems.Add(dataItemModel);
                }
            }

            dataGrid.ItemsSource = dataItems;
        }
    }
}
第 4 步:实现结果
  • 添加行功能:用于向 DataTable 中插入新行。
  • 删除行功能:用于删除已添加的 DataTable 中的条目。
  • 显示详情功能:用于展示已添加到 DataTable 的所有行。

译文地址:c-sharpcorner.com/article/how-to-store-temporary-information-in-table-like-format-in-c-sharp/


关注公众号DotNet开发跳槽    

DotNet开发跳槽
本公众号专注为.net开发工程师提供一个学习技术及求职/跳槽的交流平台。不定期分享NET技术类文章、面试题、求助技巧等干货,原创文章300+篇,让.net开发工程师学习/面试不再迷茫。ps: 后台回复“跳槽”,免费领取.NET开发面试题!
 最新文章