【问题标题】:How to use a Class as a database for DataGridView in C# without an SQL?如何在没有 SQL 的情况下在 C# 中将类用作 DataGridView 的数据库?
【发布时间】:2021-11-30 00:31:29
【问题描述】:

我必须在 c# 中为一个学校项目使用一个类作为一个 winforms 项目的数据库,但我们还没有学习 mySQL。如果没有 mySQL,如何将类用作数据库?

【问题讨论】:

  • 这能回答你的问题吗? Using a list as a data source for DataGridView
  • 在你的项目中添加一个DataSet文件,放入表;它们本身就是类。您可以使用 DataSet 的 read/writeXml 方法轻松保存和加载它,不需要 db。/DataSet 甚至支持关系和其他类似 db 的东西。我之所以这样说是因为我觉得你们的学校更有可能想要像 Auditive 所建议的那样,即使创建数据集的工作量更少且功能更多

标签: c# winforms


【解决方案1】:

为了提防不喜欢,我想建议使用Singleton pattern 创建一个类,将一些List<T> 存储为“数据库表”。也可能有几个Lists,每个代表不同的“数据库表”(public List<T> Customerspublic List<T> Sales 等)。

public sealed class RuntimeDatabase
{
    private List<Person> persons = new List<Person>();

    // List used as database table
    public List<Person> Persons
    {
        get => persons;
        private set => persons = value;
    }

    // Singleton
    private static readonly RuntimeDatabase instance = new RuntimeDatabase();

    public static RuntimeDatabase Instance => instance;

    private RuntimeDatabase() { }
}

您可以在其他地方使用它:

public partial class MainWindow : Window
{
    private readonly RuntimeDatabase DB = RuntimeDatabase.Instance;

    private void GetPersons()
    { 
        dataGrid.ItemsSource = DB.Persons;
    }

    private void AddPerson()
    {   
        Person p = new Person();
        p.Name = "John Wick";
 
        DB.Persons.Add(p);
    }

    private void RemovePerson()
    {   
        Person p = new Person();
        p.Name = "John Wick";
 
        DB.Persons.Remove(p);
    }
}

或者在RuntimeDatabase类中创建自定义方法包装器来模仿InsertUpdateDeleteTruncateSelect等动作。

草图:

public sealed class RuntimeDatabase
{  
    //...

    public List<Person> Select(Func<Person, bool> func)
    {
        return persons.Where(func).ToList();
    }

    public void Insert(Person person)
    {
        persons.Add(person);
    }

    public void Update(Person person)
    {
        persons = persons.Select(x => 
        { 
            if (x.ID == person.ID) // It's preferred to have an ID property to unique each Person (some kind of Primary Key)
            {
                x.SomeProperty = person.SomeProperty;
            }

            return x;
        }).ToList();
    }

    public int Delete(Predicate<Person> predicate)
    {
        return persons.RemoveAll(predicate); // Count of removed elements
    }

    public void Truncate()
    {
        persons.Clear();
    }
}

当然,您可以创建一个方法,在应用程序退出之前将其保存到某个文件中,并在应用程序启动时重新加载。

示例中使用的Person是简单的模型类:

public class Person 
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string SomeProperty { get; set; }
}

随意向我扔泥巴。

【讨论】:

  • 尊重、成熟的软件开发专业人士之间不应该有任何泥泞;如果您遇到任何问题,请使用评论旁边的图标将其标记出来。降级速度比与他们一起陷入泥潭要快;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2016-11-12
  • 2018-01-13
  • 1970-01-01
相关资源
最近更新 更多